mongodb $ elemMatch

时间:2012-02-09 08:10:03

标签: mongodb mongoose

根据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}] } } )

我试过,它不起作用。

3 个答案:

答案 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运算符的查询必须扫描   与查询数组中第一个元素匹配的所有文档。如   结果,即使有索引支持查询,操作也可以   长时间运行,特别是当数组中的第一个元素是   不是很有选择性。