在 MongoDB 集合中计算字段数

9

我有一系列类似于这个的文档:

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

我希望能够遍历整个集合并找到字段的总数。在这个示例文档中,有3个字段(不包括_id),但是文档中的字段数量范围从2到50个不等。最终,我只想知道每个文档平均有多少个字段。
有什么想法吗?
4个回答

12
遍历整个集合,找到其中所有字段的数量。
现在您可以利用聚合操作符$objectToArray (SERVER-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以计算平均值。

抱歉问一个新手问题,你在哪个环境下运行这个命令? - samjewell
1
@samjewell 在 MongoDB shell(MongoDB原生)或类似Robo 3T客户端的shell中。 - Kit

7
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)算法,但我不确定是否有更好的方法。


3

这让我有些心动。我一开始有点犹豫要不要写下去... 但是我还是写了出来,实际上很简单(虽然我跳过了Map-Reduce部分)。 - adamb0mb

0

一个简单的方法是使用find()函数查找所有的值,然后对于每组记录获取数组的大小。

db.getCollection().find(<condition>)

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

sizeOf(Array[i])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接