我试图编写一个查询查询,其中其中一个密钥在查询运行时是未知的,例如在以下文档中我有兴趣返回文档,如果"设置"是的:
{
"a": {
"randomstringhere": {
"setup": true
}
}
}
然而,我无法工作如何通配" randomstringhere"字段,因为它更改为集合中的每个文档。
有人可以帮忙吗?
答案 0 :(得分:0)
你无能为力。但您可以像
一样修改集合架构{
"a": [
{
"keyName": "randomstringhere",
"setup": true
},
//...
]
}
你可以写查询来查看
{
'a' : { $elemMatch: { setup: true } ,
}
答案 1 :(得分:0)
您无法通过单个查询执行此操作,与当前设计一样,您需要一种机制来获取所需的所有随机密钥,然后汇编使用 {{3如果您获得变量键名称列表,则运行。
您可以使用 $or
进行操作的第一部分。以下mapreduce操作将填充一个名为collectionKeys的单独集合,其中所有随机键都作为_id值:
mr = db.runCommand({
"mapreduce": "collection",
"map" : function() {
for (var key in this.a) { emit(key, null); }
},
"reduce" : function() { },
"out": "collectionKeys"
})
要获取所有随机密钥的列表,请在生成的集合上运行distinct:
db[mr.result].distinct("_id")
示例输出
["randomstring_1", "randomstring_2", "randomstring_3", "randomstring_4", ...]
现在给出上面的列表,您可以通过创建一个将在循环中设置其属性的对象来组装您的查询。通常,您的查询文档将具有以下结构:
var query = {
"$or": [
{ "a.randomstring_1.setup": true },
{ "a.randomstring_2.setup": true },
{ "a.randomstring_3.setup": true }
]
};
然后您可以在查询中使用
db.collection.find(query)
因此,使用上面的子文档键列表,您可以使用JavaScript的 Map-Reduce 方法动态构建上述内容:
mr = db.runCommand({
"mapreduce": "collection", // your collection name
"map" : function() { // map function
for (var key in this.a) { emit(key, null); }
},
"reduce" : function() { }, // empty reducer that doesn't do anything
"out": "collectionKeys" // output collection with results
})
var randomstringKeysList = db[mr.result].distinct("_id"),
orOperator = randomstringKeysList.map(function (key){
var o = {};
o["a."+ key +".setup"] = true;
return o;
}),
query = { "$or": orOperator };
db.collection.find(query);