【问题标题】:Count fields in a MongoDB Collection计算 MongoDB 集合中的字段
【发布时间】:2020-07-01 05:23:39
【问题描述】:

我有一组像这样的文档:

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

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

有什么想法吗?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    遍历整个集合,找出所有字段数

    现在您可以使用aggregation 运算符$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 在 MongoDB shell(原生于 MongoDB)或客户端的 shell(如 Robo 3T)中
    【解决方案2】:
    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 作业。在Map stepiterate over the properties of each document as a javascript object中,输出count和reduce得到总数。

      【讨论】:

      • 这让我崩溃了。我很犹豫要不要写……但我写了,而且实际上很简单(不过我跳过了 Map-Reduce 部分)
      【解决方案4】:

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

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

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

      sizeOf(Array[i])
      

      【讨论】:

        猜你喜欢
        • 2020-05-09
        • 2019-04-06
        • 1970-01-01
        • 2013-09-01
        • 2019-08-04
        • 1970-01-01
        • 2018-06-20
        • 1970-01-01
        相关资源
        最近更新 更多