【问题标题】:Retrieving count of specific attribute in MongoDB collection检索 MongoDB 集合中特定属性的计数
【发布时间】:2014-11-11 03:09:36
【问题描述】:

我有一个包含大量数据的 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_objects 列表。上述文档有 3 个数据对象。我需要获取此集合中数据对象的总数。我怎样才能得到这个总数?

【问题讨论】:

    标签: java mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您基本上追求的是“总结”集合中包含在您的文档中的数组元素的总长度。

    借助 MongoDB 2.6,这非常简单,这要归功于 $size 运算符:

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

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

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

    由于数组内容现在已“去规范化”,因此只需计算总条目数。所以$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));
    

    理想情况下,您应该考虑在文档中“存储”数组长度。这对于“查询”目的很有用,并且不需要“即时”计算。使用$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" }
        }}
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2019-09-02
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多