匹配包含MongoDB中提供的数组的任意组合的数组字段
我希望使用指定的数组元素列表进行查询,以便返回的文档只能包含我传递的元素,而不必包含所有元素 给定文件,如:匹配包含MongoDB中提供的数组的任意组合的数组字段,mongodb,Mongodb,我希望使用指定的数组元素列表进行查询,以便返回的文档只能包含我传递的元素,而不必包含所有元素 给定文件,如: { name: "Article 1", tags: ["Funny", "Rad"] } { name: "Article 2", tags: ["Cool", "Rad"] } { name: "Article 3", tags: ["Rad"] } 下面是一些示例数组及其各自的结果 [“Rad”]应返回第3条 [“Rad”,“Cool”]应返回第2条
{
name: "Article 1",
tags: ["Funny", "Rad"]
}
{
name: "Article 2",
tags: ["Cool", "Rad"]
}
{
name: "Article 3",
tags: ["Rad"]
}
下面是一些示例数组及其各自的结果
应返回第3条[“Rad”]
应返回第2条和第3条[“Rad”,“Cool”]
不应返回任何内容,因为没有文章只包含一个或两个标签[“搞笑”、“酷”]
我相信我可以用
$where
实现这一点,但出于明显的原因,我希望避免使用这一点。可以通过组合多个运算符来实现这一点:
db.test.find({tags:{$not:{$elemMatch:{$nin:['Rad','Cool']}})
带有$nin
的$elemMatch
正在查找单个标记既不是'Rad'也不是'Cool'的文档,然后父$not
反转匹配以返回与任何元素都不匹配的所有文档
但是,这也将返回标记
缺失或没有元素的文档。要排除这些元素,您需要添加一个限定符,以确保标记
至少有一个元素:
db.test.find({
标记:{$not:{$elemMatch:{$nin:['Rad','Cool']}},
'tags.0':{$exists:true}
})
希望跟进这一点,并指出几个月后,由于我们的收藏规模不断扩大,这一功能不再适用于我们。因为此查询使用了$nin
和$not
,所以Mongo必须执行完整的集合扫描才能执行查询。