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

blo*_*ilk 5 mongodb

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

鉴于以下文件:

{
  name: "Article 1",
  tags: ["Funny", "Rad"]
}

{
  name: "Article 2",
  tags: ["Cool", "Rad"]
}

{
  name: "Article 3",
  tags: ["Rad"]
}
Run Code Online (Sandbox Code Playgroud)

以下是一些示例数组及其各自的结果.

  • ["Rad"] 应该归还第3条
  • ["Rad", "Cool"] 应归还第2条和第3条
  • ["Funny", "Cool"] 应该什么都不返回,因为没有文章只有这些标签中的一个或两者都有

我相信我可以解决这个问题,$where但我想避免这种情况,原因很明显.

Joh*_*yHK 6

您可以通过组合多个运算符来实现:

db.test.find({tags: {$not: {$elemMatch: {$nin: ['Rad', 'Cool']}}}})
Run Code Online (Sandbox Code Playgroud)

$elemMatch$nin被发现的文档在一个单一的tags元素既不是"拉德"也不是"酷",然后父$not反转匹配返回所有在那里不匹配的任何元素的文档.

但是,这也将返回tags缺少或没有元素的文档.要排除那些你需要添加一个确保tags至少有一个元素的限定符:

db.test.find({
    tags: {$not: {$elemMatch: {$nin: ['Rad', 'Cool']}}},
    'tags.0': {$exists: true}
})
Run Code Online (Sandbox Code Playgroud)