我想查询指定的数组元素列表,以便返回的文档只能包含我传递的元素,但不需要包含所有元素。
给出如下文件:
{
name: "Article 1",
tags: ["Funny", "Rad"]
}
{
name: "Article 2",
tags: ["Cool", "Rad"]
}
{
name: "Article 3",
tags: ["Rad"]
}
以下是一些示例数组及其各自的结果。
["Rad"]
应该返回第3条["Rad", "Cool"]
应返回第2条和第3条["Funny", "Cool"]
不应该返回任何内容,因为没有文章只包含其中一个标签或两者都我确定我可以使用$where
来解决此问题,但我还是希望避免这种情况。
答案 0 :(得分:6)
您可以通过组合多个运算符来实现此目的:
db.test.find({tags: {$not: {$elemMatch: {$nin: ['Rad', 'Cool']}}}})
$elemMatch
$nin
找到了单个tags
元素既不是'Rad'也不是'Cool'的文档,然后父$not
反转了匹配以返回与任何元素不匹配的所有文档。
但是,这也会返回tags
缺失或没有元素的文档。要排除那些您需要添加一个限定符,以确保tags
至少有一个元素:
db.test.find({
tags: {$not: {$elemMatch: {$nin: ['Rad', 'Cool']}}},
'tags.0': {$exists: true}
})