1

我需要一些帮助才能跨所有文档对字段中的嵌套对象创建计数查询。每个文档 json 都有很多字段。一个称为“热链接”的特定字段由许多内部动态对象字段组成。

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

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

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

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

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

非常感谢,卡兰

4

2 回答 2

2

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

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

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

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

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

示例输出

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

于 2019-01-11T14:58:23.343 回答
1

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

var hotlinkTotal=0;
db.collection.find().forEach(function(x){hotlinkTotal+=x.hotlinks.length;});
print(hotlinkTotal);
于 2013-08-12T09:59:57.110 回答