Mongo:查询以获取嵌套字段中的对象计数

时间:2013-08-12 09:54:43

标签: mongodb mongodb-query aggregation-framework

我需要一些帮助来在所有文档中的字段中的嵌套对象上创建计数查询。每个文件json都有很多字段。称为“热链接”的一个特定字段包含许多内部动态对象字段。

Doc1:
{
  hotlinks : { 112222:{....} , 333333: {.....} , 545555: {.....}      }
}

Doc2:
{
  hotlinks : { 67756:{....} , 756767: {.....} , 1111111: {.....}      }
}

每个文档都有一个热链接字段。热链接字段包括各种内部热链接对象。每个键都是一个java唯一ID,并且包含包含数据的对象(内部字段)。

我需要一种方法来获取该字段的所有内部嵌套对象的计数 - “hotlinks”。 例如,doc1和doc2中热链接的内部对象的总和将为6。

有没有办法通过单个查询来完成所有文档的计数。

非常感谢, 卡兰

2 个答案:

答案 0 :(得分:1)

这可能不是最好的方法,但您可以定义一个javascript变量并总结计数。即;

var hotlinkTotal=0;
db.collection.find().forEach(function(x){hotlinkTotal+=x.hotlinks.length;});
print(hotlinkTotal);

答案 1 :(得分:0)

如果通过聚合框架使用MongoDB 3.6和更高版本,则很有可能。 在聚合管道中使用 $objectToArray 运算符可将文档转换为数组。返回数组包含原始文档中每个字段/值对的元素。返回数组中的每个元素都是一个文档,其中包含两个字段kv

在获取数组时,您可以利用 $size 运算符的使用,该运算符将返回给定数组中元素的数量,从而为您提供每个文档的计数。

要获取所有文档的计数,需要一个$group管道,您可以在其中指定_id键为null或一个常量值,该键可以计算整个输入文档的累计值。

所有这些都可以通过嵌套以下表达式在单个管道中完成:

db.collection.aggregate([
    { "$group": {
        "_id": null,
        "count": {
            "$sum": { 
                "$size": { "$objectToArray": "$hotlinks" }
            }
        }
    } }     
])

示例输出

{
    "_id" : null,
    "count" : 6
}