我有一个文档可以包含未知数量的子文档的集合:
"agent_id": {
"0":"1234",
"1":"2234",...etc
如何在所有agent_id
子字段中搜索完全匹配?
答案 0 :(得分:0)
您需要动态创建一个对象,其属性是嵌入文档名称agent_id
与点(。)和字段名称的串联,用引号括起来,如下所示:
var query = {
"agent_id.0": "78343",
"agent_id.1": "78343",
"agent_id.2": "78343",
"agent_id.3": "78343",
...
"agent_id.n": "78343"
}
创建对象的一种方法是使用 mapReduce 生成子文档密钥。以下演示了这种方法。在Map-Reduce操作中,agent_id
子文档中的一组键生成到输出集合" collection_keys"然后用于生成 find()
查询表达式:
假设您填充样本集
db.collection.insert([
{
"agent_id": {
"0":"1234",
"1":"2234",
"56":"8451",
"74":"1475",
"10":"1234"
}
},
{
"agent_id": {
"5":"5874",
"18":"2351"
}
}
])
运行以下mapReduce操作
var mr = db.runCommand({
"mapreduce" : "collection",
"map" : function() {
for (var key in this.agent_id) { emit(key, null); }
},
"reduce" : function(key, stuff) {
return null
},
"out": "collection" + "_keys"
});
var query = { "$or": [] },
value = "1234";
db[mr.result].distinct("_id").forEach(function (key){
var obj = {};
obj["agent_id." + key] = value;
query["$or"].push(obj)
});
printjson(query);
将产生:
{
"$or" : [
{
"agent_id.0" : "1234"
},
{
"agent_id.1" : "1234"
},
{
"agent_id.10" : "1234"
},
{
"agent_id.18" : "1234"
},
{
"agent_id.5" : "1234"
},
{
"agent_id.56" : "1234"
},
{
"agent_id.74" : "1234"
}
]
})
然后,您可以在 find()
查询中使用查询文档:
db.collection.find(query)
将产生结果:
/* 0 */
{
"_id" : ObjectId("561d5312cd05efc95a1ea1f4"),
"agent_id" : {
"0" : "1234",
"1" : "2234",
"56" : "8451",
"74" : "1475",
"10" : "1234"
}
}