MongoDB过滤如果所有键都作为字段存在

时间:2014-06-10 14:30:23

标签: mongodb mongoid mongodb-query

我想过滤所有键(以列表格式存在)作为字段存在的文档。我可以用字段作为一个接一个的密钥查询多次

{ field: { $exists: <boolean> } }

但这似乎并不特别有效。我也很关心速度。它是否基本上是一个线性搜索,即使有一些键被索引。

此外,是否存在一种简单的语法,用于查询是否存在任何键作为字段?

编辑:

举个例子,让我们说keys = ['key1','key2','key3']。 现在,我想过滤所有包含&#39; key1&#39;,&#39; key2&#39;和&#39; key3&#39;作为领域。

2 个答案:

答案 0 :(得分:2)

这里你真正的意思是$all运算符:

db.collection.find({ "keys": { "$all": ["key1","key2","key3"] } });

找到包含数组中“全部”元素的文档,例如“keys”。

您指向的$exists运算符实际上是为了查看给定的键值是否实际存在于文档中:

{ "key": "something" }

所以上下文中的$exists将是:

db.collection.find({ "key": { "$exists": true } })

意味着该字段实际存在。

因此,如果您想匹配存在的文档的“键”,如下所示:

{
    "key1": "",
    "key2": "",
    "key3": ""
}

然后你会在你的查询中列出所有这些:

db.collection.find({
    "key1": { "$exists": true },
    "key2": { "$exists": true }, 
    "key3": { "$exists": true }
})

这就是事情的运作方式。

答案 1 :(得分:0)

如果您想让所有密钥都存在,您可以尝试:

db.collection.find(
    "$or": [
        {"key1": {"$exists": true}}, {"key2": {"exists": true}}
    ]
)

或者您也可以使用“$或”来过滤是否存在任何密钥。

{{1}}