2015-10-14 64 views
0

例日期(集合名称“人”)的计数数蒙戈:在收集数组元素为每个条目

{"person" : "Frank", 
"coords" : [ 
    { 
     "point":new GLatLng(40.266044,-74.718479), 
    }, 
    { 
     "point":new GLatLng(40.211600,-74.695702), 
    } 
] } 

{"person : ""Bob", 
    "coords" : [ 
     { 
      "point":new GLatLng(40.266044,-74.718479), 
     }, 
     { 
      "point":new GLatLng(40.211600,-74.695702), 
     }, 
     { 
      "point":new GLatLng(40.294535,-74.682012), 
     } 
] } 

目标:获得每个人的文档“坐标”的条目的总数(累计总)

预期成果5

我已经试过

public int getTotalCoordinateCount(){ 

    BasicDbObject project= new BasicDBObject() 
    .append("count",new BasicDBObject("$size","coords")) 

    AggregationOutput output = db.getPeopleCollection().aggregate(Arrays. <DBObject>asList(
    new BasicDBObject("$project", project); 

    BasicDbObject result = (BasicDBObject)output.results().iterator.next(); 

    return result.getInt("count"); 

} 

问题我得到:2

懵懵懂懂什么我做错了在蒙戈聚合框架。我怀疑我需要包含一个$sum但不知道在哪里

回答

1
public int getTotalCoordinateCount(){ 

    BasicDbObject group = new BasicDBObject() 
    .append("_id", 1) 
    .append("count", new BasicDBObject("$sum", 1)); 

    BasicDbObject project= new BasicDBObject() 
    .append("_id", 0) 
    .append("count", 1); 

    AggregationOutput output = db.getPeopleCollection().aggregate(Arrays. <DBObject>asList(
    new BasicDBObject("$unwind", "coords"), 
    new BasicDBObject("$group", group), 
    new BasicDBObject("$project", project) 
    ); 

    BasicDbObject result = (BasicDBObject)output.results().iterator.next(); 

    return result.getInt("count"); 

} 
+0

@serigu感谢放松是失踪的东西 – stackoverflow

1

您需要在聚合管道中的coords字段上执行展开操作。之后,您通过Nullcount字段组成一个组来计算结果集,您将从所有文档中的所有数组中获取元素的总数。

+0

你能证明那看起来像什么吗?如果这样可以更容易地生成答案,您可以保留JSON格式。 – stackoverflow

+0

我不能用Java编写代码,但是如果您希望展开列表,您将得到的结果要比x nr文档的结果要低,x是您的编号。 – sergiuz

+0

看到我的答案,我尝试用Java为你写。 – sergiuz