检索MongoDB集合中特定属性的计数

时间:2014-11-11 03:09:36

标签: java mongodb mongodb-query aggregation-framework

我有一个包含大量数据的MongoDB集合。

我的JSON文档的一部分如下所示:

{
  "_id":{
    "$oid":"5364e0867a2690e2a2be13ff"
  },
  "share_name":"test123",
  "data_objects":[
    {
      "user":"The Flying Pirate.",
      "location":"Devon, UK.",
      "share_id":462568869077716992
    },
    {
      "user":"The Dragon.",
      "location":"London, UK.",
      "share_id":462568869077716992
    },
    {
      "user":"lozzien",
      "location":"Miami, USA.",
      "share_id":462568869077716992
    }
  ]
}

如您所见,单个文档可以包含data_object列表。上述文档有3个数据对象。我需要获取此集合中数据对象的总数。我怎样才能得到这个总数?

1 个答案:

答案 0 :(得分:0)

你基本上是在"总结"文档中包含的数组元素的总长度。

使用MongoDB 2.6,这要归功于$size运算符:

db.collection.aggregate([
    { "$group": {
        "_id": null,
        "totalSize": { "$sum": { "$size": "data_objects" } }
    }}
])

在以前的版本中,您将需要其他方法来获取数组" size"。值得注意的是$unwind运营商:

db.collection.aggregate([
    { "$unwind": "$data_objects" },
    { "$group": {
        "_id": null,
        "totalSize": { "$sum": 1 }
    }}
])

由于阵列内容现在已经过去标准化,并且#34;它只是计算总条目的问题。因此,对于集合中的每个展开文档,$sum 1。

为Java驱动程序编写这个并不难:

    DBObject group = new BasicDBObject(
        "$group", new BasicDBObject(
            "_id",null
        ).append(
            "totalSize", new BasicDBObject(
                "$sum", new BasicDBObject(
                    "$size", "data_objects"
                )
            )
        )
    );

    db.getCollection("collection").aggregate(Arrays.asList(group));

理想情况下,您应该考虑"存储"文档中的数组长度。这对"查询"非常有用。目的并且无需计算这个"在飞行中#34;。使用$inc运算符以及$push$pull处理添加内容:

用于向数组添加数据:

db.collection.update(
    { "_id": Objectid("5364e0867a2690e2a2be13ff") },
    {
        "$push": { "data_objects": newObject },
        "$inc": { "data_count": 1 }
    }
)

删除:

db.collection.update(
    { "_id": Objectid("5364e0867a2690e2a2be13ff") },
    {
        "$pull": { "data_objects": removeReqery },
        "$inc": { "data_count": -1 }
    }
)

然后,您始终在执行相同的聚合:

db.collection.aggregate([
    { "$group": {
        "_id": null,
        "totalSize": { "$sum": "$data_count" }
    }}
])