如何用 MongoDB $elemMatch 获取所有匹配项?

How to get all matches with MongoDB $elemMatch?

我有两个对象:

{
  genre: ['music', 'movie']
}

{
 genre: ['movie', 'music']
}

我的查询是:

db.test.find({genre :{ $elemMatch:{ $in : ['movie']}}})

它只给了我第二个对象。为什么?我想获取数组中包含特定类型的所有文档,无论数组中的哪个位置。我该怎么做?

在这种情况下,您既不需要 $elemMatch 也不需要 $in。一个简单的 field:value 将匹配其中 field 是一个数组并且该数组中的任何一个值是 value 的文档。也就是说

db.test.find({genre :'movie'});

就够了。

在更复杂的情况下需要数组查询运算符。

  • $in 当您有一个可能值的列表并且想要在其中找到 any 的文档时需要
  • $in(所以 db.test.find({genre : { $in:['movie']} }); 可以工作,但是会不必要地令人费解)
  • $all 与 $in 类似,但要求 所有 提供的元素都在数组
  • $elemMatch 有点复杂。当您想要使用多个运算符条件(如 $gt 或 $lt)但只想要那些其中一个数组条目匹配 all 条件的文档时,它是必需的。如果没有 $elemMatch 运算符,您会得到至少一个数组条目满足每个条件的结果,但不一定全部由同一条目满足。

记住 db.test.find() 通常 returns 你的光标对象。您可以按以下方式访问所有文档:

entry = db.test.find({genre :{ $elemMatch:{ $in : ['movie']}}})
for doc in entry:
    print(doc)