我在具有以下结构的MongoDB集合中有记录:
{
'field1': {
'a': 3,
'b': 1,
'c': 4,
...
}
}
我想查找field1
中的密钥所在的所有记录:['a','b']
。
如何构建一个可以执行此操作的MongoDB查询?
我发现this post描述了如何查找具有特定子字段的所有记录。我想做同样的事情,但是要测试多个子字段。
谢谢!
编辑:我知道我可以编写以下表格的查询: {'$and': [{'field1.a': {'$exists': true}, {'field1.b': {'$exists': true}]}
但是,我想找到一种传递我正在寻找的子字段列表的方法,而不是为每个额外的键添加另一个$exists
。
答案 0 :(得分:0)
我不知道任何能够自动执行此操作的MongoDB查询。但是,如果您愿意利用mongo
shell中提供的JavaScript,则可以动态生成$and
查询,这可能会有所帮助。例如,根据您的示例数据,您可以执行以下操作:
var q = { "$and" : [] };
var arr = ["a", "b", "c"];
for (key in arr) {
var field = "field1." + arr[key];
var clause = {};
clause[field] = { "$exists" : true };
q["$and"].push(clause);
}
db.collection.find(q);
每次添加密钥时,这肯定比手动编辑查询更容易。
<强> [编辑] 强>
请注意,您不需要在查询中使用显式$and
,而只需使用逗号分隔子句。来自文档中的this page。
MongoDB在指定逗号分隔的表达式列表时提供隐式AND操作。当必须在多个表达式中指定相同的字段或运算符时,必须使用带有$和运算符的显式AND。
这意味着您可以按如下方式生成更简单的查询:
var q = {};
var arr = ["a", "b", "c"];
for (key in arr) {
var field = "field1." + arr[key];
q[field] = { "$exists" : true };
}
db.collection.find(q);