如何用 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)
我有两个对象:
{
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)