MongoDB:通过检查子字段键是否包含指定的集来过滤记录

时间:2015-02-24 14:33:03

标签: mongodb

我在具有以下结构的MongoDB集合中有记录:

{
    'field1': {
        'a': 3,
        'b': 1,
        'c': 4,
        ...
    }
}

我想查找field1中的密钥所在的所有记录:['a','b']

如何构建一个可以执行此操作的MongoDB查询?

我发现this post描述了如何查找具有特定子字段的所有记录。我想做同样的事情,但是要测试多个子字段。

谢谢!

编辑:我知道我可以编写以下表格的查询:

{'$and': [{'field1.a': {'$exists': true}, {'field1.b': {'$exists': true}]}

但是,我想找到一种传递我正在寻找的子字段列表的方法,而不是为每个额外的键添加另一个$exists

1 个答案:

答案 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);