根据mongodb doc,$ elemMatch的语法是,
t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } )
我试过,它工作正常。 上述意味着,它可以找到数组x中是否存在对象{a:1,b:'大于1'}。
我有一个要求,我需要弄清楚数据库中是否存在数组中的所有对象。
例如,假设我有一个数组,a=[{a:1, b:2},{a:3, b:4}, {a:5, b:6}]
我需要找出x是否包含所有这些。
发现({x:{$ elemMatch:{a:{$ all:[1]},b:{$ all:[2]}}}})并找出包含{a: 1,b:2}
但如果我尝试t.find( { x : { $elemMatch : { a : {$all:[1,3]}, b : {$all:[2,4]} } } } )
,它就失败了。我知道这不对。
有什么办法可以实现吗?
理想,应该是,
t.find( { x : { $elemMatch : {$all:[ {a:1, b:2}, {a:3, b:4}] } } )
我试过,它不起作用。
答案 0 :(得分:1)
您不能使用 elemMatch ,但您只需创建一个查询,检查 a 是否与整个数组匹配:
db.items.insert({ 'foo' : 1, 'a' : [{a:1, b:2},{a:3, b:4}, {a:5, b:6}]}); db.items.insert({ 'foo' : 1, 'a' : [{a:1, b:2},{a:3, b:4}, {a:8, b:7}]}); db.items.find({'a': [{a:1, b:2},{a:3, b:4}, {a:8, b:7}]}); { "_id" : ObjectId("4f3391856e196eca5eaa7518"), "foo" : 1, "a" : [ { "a" : 1, "b" : 2 }, { "a" : 3, "b" : 4 }, { "a" : 8, "b" : 7 } ] }
但是,为了使其工作,数组中元素的顺序对于文档和查询必须相同。以下内容无法找到:
db.items.find({'a': [{a:3, b:4},{a:1, b:2}, {a:8, b:7}]});
(因为 {a:3,b:4} 和 {a:1,b:2} 交换了。
答案 1 :(得分:1)
t.find({$and:[{a:{$elemMatch:{a:1, b:2}}}, {a:{$elemMatch:{a:3, b:4}}}, {a:{$elemMatch:{a:5, b:6}}}]})
但它并不是一个特别高性能的选择。
答案 2 :(得分:0)
这个怎么样:
db.items.find({x : { $all: [
{$elemMatch: {a: 1, b: 2}},
{$elemMatch: {a: 3, b: 4}},
{$elemMatch: {a: 5, b: 6}}
]}}
查看Mongo docs。
另外,请注意文档警告:
在当前版本中,使用$ all运算符的查询必须扫描 与查询数组中第一个元素匹配的所有文档。如 结果,即使有索引支持查询,操作也可以 长时间运行,特别是当数组中的第一个元素是 不是很有选择性。