计算MongoDB集合中的字段

时间:2012-12-10 23:54:16

标签: mongodb mongodb-query

我有一组像这样的文件:

{
    "_id" : ObjectId("..."),
    "field1": "some string",
    "field2": "another string",
    "field3": 123
}

我希望能够遍历整个集合,并找到所有字段。在此示例文档中有3个(我不想包含_id),但它在文档中的范围是2到50个字段。最后,我只是在寻找每个文档的平均字段数。

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

  

迭代整个集合,找到所有字段数

现在,您可以利用aggregation运营商$objectToArraySERVER-23310)将密钥转换为值并对其进行计数。 MongoDB v3.4.4 +

中提供了此运算符

例如:

db.collection.aggregate([
         {"$project":{"numFields":{"$size":{"$objectToArray":"$$ROOT"}}}}, 
         {"$group":{"_id":null, "fields":{"$sum":"$numFields"}, "docs":{"$sum":1}}}, 
         {"$project":{"total":{"$subtract":["$fields", "$docs"]}, _id:0}}
])

第一阶段$project是将所有键转换为数组以计算字段。第二阶段$group用于汇总集合中的键/字段数,以及处理的文档数。第三阶段$project正在减去具有文档总数的字段总数(因为您不想计算_id)。

您可以轻松添加$avg以计算最后一个阶段的平均值。

答案 1 :(得分:4)

PRIMARY> var count = 0;
PRIMARY> db.my_table.find().forEach( function(d) { for(f in d) { count++; } });
PRIMARY> count
1074942

这是我弄清楚如何做到这一点的最简单方法。在非常大的数据集上,去Map-Reduce路径可能是有意义的。但是,虽然你的设置足够小,但这样做。

这是O(n^2),但我不确定有更好的方法。

答案 2 :(得分:2)

您可以创建Map-Reduce作业。在地图步骤iterate over the properties of each document as a javascript object中,输出计数并减少以获得总数。

答案 3 :(得分:0)

对于一个简单的方法,只需查找()所有值,并为每组记录获取数组的大小。



db.getCollection().find(<condition>)
&#13;
&#13;
&#13;

然后

对于每组结果,获取数组的大小。

&#13;
&#13;
sizeOf(Array[i])
&#13;
&#13;
&#13;