如果所有键都作为字段存在,则MongoDB筛选器

如果所有键都作为字段存在,则MongoDB筛选器,mongodb,mongoid,mongodb-query,Mongodb,Mongoid,Mongodb Query,我想筛选所有键(以列表格式显示)作为字段存在的文档。我可以用字段作为一个键一个接一个地查询多次 { field: { $exists: <boolean> } } {field:{$exists:} 但这似乎不是特别有效。我还担心速度。它本质上是一个线性搜索,即使有几个键被索引 另外,是否有一个简单的语法用于查询是否有任何键作为字段存在 编辑: 例如,让我们假设keys=['key1','key2','key3']。 现在,我想筛选所有包含“key1”、“key2”和“key3”

我想筛选所有键(以列表格式显示)作为字段存在的文档。我可以用字段作为一个键一个接一个地查询多次

{ field: { $exists: <boolean> } }
{field:{$exists:}
但这似乎不是特别有效。我还担心速度。它本质上是一个线性搜索,即使有几个键被索引

另外,是否有一个简单的语法用于查询是否有任何键作为字段存在

编辑:

例如,让我们假设
keys=['key1','key2','key3']

现在,我想筛选所有包含“key1”、“key2”和“key3”字段的文档。

这里您真正的意思是运算符:

db.collection.find({“keys”:{“$all”:[“key1”、“key2”、“key3”]});
它查找将包含数组中“所有”元素(如“键”)的文档

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

{“key”:“某物”}
因此,在上下文中:

db.collection.find({“key”:{“$exists”:true})
这意味着该字段实际上是存在的

因此,如果您希望匹配当前文档的“键”,如下所示:

{
“第1项”:“,
“第2项”:“,
“键3”:”
}
然后,您将在查询中按如下方式列出它们:

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

这就是工作方式。

如果您想获得所有密钥,可以尝试:

db.collection.find(
    "$and": [
        {"key1": {"$exists": true}}, {"key2": {"exists": true}}
    ]
)
或者,如果存在任何密钥,也可以使用“$或”进行筛选

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

您可能需要指定实际的查询示例,以明确您的意图。您似乎要求指定键的所有字段出现在数组的所有成员中。这是你的问题吗?如果你编辑它以准确显示你的意思会更好。真假案例有助于人们理解。@NeilLunn感谢您指出这一点。请参阅更新的问题。如果仍然不清楚,请在这里发表评论。非常感谢!另外,你知道查询的速度有多快吗?我认为它应该使用索引(如果一些键被索引)?此外,如果我在中使用
$in,它将在存在任何键时过滤文档。对吗?@Peeyush在“keys”字段中添加索引是个好主意。当它是数组字段时,称为多键索引
$all
按照文档中的说明工作,是相同字段值上的
$和
的快捷方式。它可以非常有效地使用索引。欢迎接受您的回答。我非常抱歉!!我错误地解释了你的答案:(.我正在寻找
$只存在
,只是我想指定一个键列表而不是一个键!!@peeyus这不是你的问题的内容。请指定完整的文档和你期望的内容。但我认为答案末尾的编辑确实解释了这一点。@peeyus使用
$或
操作符