匹配一个数组字段,其中包含MongoDB中提供的数组的任意组合

时间:2014-08-14 21:44:39

标签: mongodb

我想查询指定的数组元素列表,以便返回的文档只能包含我传递的元素,但不需要包含所有元素。

给出如下文件:

{
  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来解决此问题,但我还是希望避免这种情况。

1 个答案:

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