gpt4 book ai didi

mongodb - 在MongoDB中查询 map 大小

转载 作者:可可西里 更新时间:2023-11-01 10:26:33 25 4
gpt4 key购买 nike

假设您在 mongodb 中有一个可变大小的 map 。如何获得只有特定 map 大小(例如 >2)的文档?

{map:{k1:v1, k2:v2, k3,v3}} 
{map:{k1:v1, k2:v2}}

最佳答案

使用 MongoDB 3.6 及更高版本:

使用 $expr 运算符,这允许您使用聚合框架运算符,特别是 $objectToArray 将 map 子文档转换为键值数组的运算符,即

{ map: {
k1:v1,
k2:v2,
k3,v3
}}

转化为数组

{ map: [
{ k: 'k1', v: 'v1' },
{ k: 'k2', v: 'v2' },
{ k: 'k3', v: 'v3' }
]}

然后您可以使用数组来使用 $size 来获取长度并使用比较查询运算符进行比较 $gt .

下面的示例显示了完整的查询:

db.test.find({
"$expr": {
"$gt": [
{ "$size": { "$objectToArray": "$map" } },
2
]
}
})

对于不支持上述运算符的 MongoDB 版本,如果您想稍后对其进行查询,则需要预先计算此类映射大小,因此请考虑创建一个新字段 "keyCount" 包含 map 子文档的键数。考虑以下演示:

填充测试集合

db.test.insert([    
{
"_id" : 1,
"map" : {
"k1" : "v1",
"k2" : "v2",
"k3" : "v3"
}
},
{
"_id" : 2,
"map" : {
"k1" : "v1",
"k2" : "v2"
}
}
]);

与当前设计一样,您需要一种机制来获取 map 文档中所有键的数量。这可以通过 Map-Reduce 实现。 。以下 mapreduce 操作将使用添加的新字段 "keyCount" 填充一个单独的集合:

var mr = db.runCommand({
"mapreduce": "test",
"map" : function() {
var obj = this;
obj['keyCount'] = Object.keys(this.map).length;
emit(this._id, obj);
},
"reduce" : function(key, stuff) { return null; },
"out": "my_collection" + "_keys"
})

要获取只有特定 map 大小的文档,例如 > 2,请对结果集合运行查询:

db[mr.result].find({ "value.keyCount": { "$gt": 2 } });

Map Reduce 输出

/* 0 */
{
"result" : "my_collection_keys",
"timeMillis" : 7,
"counts" : {
"input" : 2,
"emit" : 2,
"reduce" : 0,
"output" : 2
},
"ok" : 1
}

查询输出

/* 0 */
{
"_id" : 1,
"value" : {
"_id" : 1,
"map" : {
"k1" : "v1",
"k2" : "v2",
"k3" : "v3"
},
"keyCount" : 3
}
}

关于mongodb - 在MongoDB中查询 map 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33372395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com