如何与MongoDB $ elemMatch进行所有比赛?

时间:2015-09-15 11:43:04

标签: node.js mongodb database nosql

我有两个对象:

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

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

我的查询是:

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

它只给了我第二个对象。为什么?我希望无论阵列中的哪个位置都能获得其数组中包含特定类型的所有文档。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

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

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

就足够了。

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

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

答案 1 :(得分:0)

记住db.test.find()通常会返回游标对象。您可以按如下方式访问所有文档:

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