让我们说一个文件是:
{
a: 1,
b: 1,
c: 2,
....
z: 2
}
Run Code Online (Sandbox Code Playgroud)
如何计算此类文档中的密钥数?
谢谢
在Mongo中(和大多数NoSQL解决方案一样)如果你想稍后对它们进行查询(例如"不同键的数量> 12"),预先计算这些值通常是一个好主意,所以你可以考虑添加一个新的字段"keyCount",每次添加新密钥时都会递增.
如果通过聚合框架使用MongoDB 3.6和更新版本,则非常可能.使用$objectToArray聚合管道中的运算符将文档转换为数组.返回数组包含原始文档中每个字段/值对的元素.在返回的数组中的每个元素是包含两个字段的文档k和v.
通过引用$$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)