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

Mongodb Mongo:查询以获取嵌套字段中的对象数,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我需要一些帮助来在所有文档中创建一个字段中嵌套对象的计数查询。每个文档json都有许多字段。一个称为“热链接”的特定字段由许多内部动态对象字段组成 Doc1: { hotlinks : { 112222:{....} , 333333: {.....} , 545555: {.....} } } Doc2: { hotlinks : { 67756:{....} , 756767: {.....} , 1111111: {.....} } } 每个文档都有一个热链

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

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

Doc2:
{
  hotlinks : { 67756:{....} , 756767: {.....} , 1111111: {.....}      }
}
每个文档都有一个热链接字段。“热链接”字段由各种内部热链接对象组成。每个键都是一个java唯一id,并且具有包含数据的对象(内部字段)

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

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

非常感谢,
Karan

这可能不是最好的方法,但您可以定义一个javascript变量并汇总计数。i、 e

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

这可能不是最好的方法,但您可以定义一个javascript变量并汇总计数。i、 e

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

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

获取数组后,您可以利用运算符返回给定数组中的元素数,从而获得每个文档的计数

获取所有文档的计数需要一个管道,在该管道中指定null的
\u id
键或一个常量值,该常量值计算所有输入文档作为一个整体的累积值

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

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

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

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

获取数组后,您可以利用运算符返回给定数组中的元素数,从而获得每个文档的计数

获取所有文档的计数需要一个管道,在该管道中指定null的
\u id
键或一个常量值,该常量值计算所有输入文档作为一个整体的累积值

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

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

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


如果不使用mapreduce功能,我很确定您只需在光标上迭代并“手动”计算子文档中出现的次数。最有效的方法是在保存或修改文档时存储计数。遗憾的是,从2.4开始,使用聚合框架无法做到这一点。如果您的热链接位于一个数组中,您可以使用$unwind和$sum来计算总数,但在这种情况下,您必须使用mapReduce,或者在客户端中使用mapReduce,而不使用mapReduce功能,我敢肯定,您只需在光标上迭代并“手动”即可计算子文档中出现的次数。最有效的方法是在保存或修改文档时存储计数。遗憾的是,从2.4开始,无法使用聚合框架执行此操作。如果您的热链接位于一个数组中,您可以使用$unwind和$sum来计算总数,但在这种情况下,您必须使用mapReduce或在clientYep中进行计算-如果不是这样,mapReduce操作将是另一种选择。您好Lix和Erdimeola,非常感谢您的回复。我收集了数千份文件。因此,我需要一种快速有效的方法来获得计数。我觉得javascript方式将是一项繁重的操作。mapreduce是否高效。。。非常感谢大家,KaranThank,如果不是这样,mapreduce操作将是另一种选择。嗨,Lix和Erdimeola,非常感谢你们的回复。我收集了数千份文件。因此,我需要一种快速有效的方法来获得计数。我觉得javascript方式将是一项繁重的操作。mapreduce是否高效。。。非常感谢,KaranThank谢谢大家