MongoDB:如何计算文档中的键数?

day*_*mer 24 mongodb

让我们说一个文件是:

{

a: 1,
b: 1,
c: 2,
 ....
z: 2
}
Run Code Online (Sandbox Code Playgroud)

如何计算此类文档中的密钥数?

谢谢

Ser*_*sev 9

没有内置命令.获取此文档并自行计算密钥.


Nic*_*ell 7

在Mongo中(和大多数NoSQL解决方案一样)如果你想稍后对它们进行查询(例如"不同键的数量> 12"),预先计算这些值通常是一个好主意,所以你可以考虑添加一个新的字段"keyCount",每次添加新密钥时都会递增.


chr*_*dam 7

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

通过引用$$ROOT当前在聚合管道阶段中处理的顶级文档的系统变量,可以对文档进行根引用.

在获取数组时,您可以利用$addFields管道步骤来创建一个保存计数的字段,并使用$size运算符派生实际计数.

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

db.collection.aggregate([
    {
        "$addFields": {
            "count": {
                "$size": { 
                    "$objectToArray": "$$ROOT"
                }
            }
        }
    }     
])
Run Code Online (Sandbox Code Playgroud)

示例输出

{
    "_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
    "a" : 1.0,
    "b" : 1.0,
    "c" : 2.0,
    "z" : 2.0,
    "count" : 5
}
Run Code Online (Sandbox Code Playgroud)

要排除该_id字段,您可以将$filter运算符用作:

db.collection.aggregate([
    {
        "$addFields": {
            "count": {
                "$size": { 
                    "$filter": {
                        "input": { "$objectToArray": "$$ROOT" },
                        "as": "el",
                        "cond": { "$ne": [ "$$el.k", "_id" ] }
                    }
                }
            }
        }
    }     
])
Run Code Online (Sandbox Code Playgroud)