mongodb$elemMatch

mongodb$elemMatch,mongodb,mongoose,Mongodb,Mongoose,根据mongodb文档,$elemMatch的语法是 t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } ) 我试过了,效果很好。 上面的意思是,它可以找到数组x中是否存在对象{a:1,b:'over 1'} 我有一个需求,需要弄清楚数组中的所有对象是否都存在于数据库中 例如,假设我有一个数组 a=[{a:1, b:2},{a:3, b:4}, {a:5, b:6}] 我需要知道x是否包含所有的元素 t、 查找({x:{$e

根据mongodb文档,$elemMatch的语法是

t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } )
我试过了,效果很好。 上面的意思是,它可以找到数组x中是否存在对象{a:1,b:'over 1'}

我有一个需求,需要弄清楚数组中的所有对象是否都存在于数据库中

例如,假设我有一个数组

a=[{a:1, b:2},{a:3, b:4}, {a:5, b:6}]
我需要知道x是否包含所有的元素

t、 查找({x:{$elemMatch:{a:{$all:[1]},b:{$all:[2]}}}})并查找包含{a:1,b:2}的所有x

但是如果我尝试,
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}] } } )

我试过了,但它不起作用。

您不能使用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 } ] } 插入({'foo':1,'a':[{a:1,b:2},{a:3,b:4},{a:5,b:6}]); 插入({'foo':1,'a':[{a:1,b:2},{a:3,b:4},{a:8,b:7}]); find({'a':[{a:1,b:2},{a:3,b:4},{a:8,b:7}]}); {u 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}]}); find({'a':[{a:3,b:4},{a:1,b:2},{a:8,b:7}]}); (因为{a:3,b:4}{a:1,b:2}是交换的)

不过,这并不是一个特别高的性能选项。

这个怎么样:

db.items.find({x : { $all: [
  {$elemMatch: {a: 1, b: 2}}, 
  {$elemMatch: {a: 3, b: 4}}, 
  {$elemMatch: {a: 5, b: 6}}
    ]}}
看看Mongo

另外,请注意文档警告:

在当前版本中,使用$all运算符的查询必须进行扫描 与查询数组中第一个元素匹配的所有文档。作为 因此,即使有支持查询的索引,操作也可能 长时间运行,特别是当数组中的第一个元素是 不是很有选择性


谢谢这很好。我的问题是,我有一个'c',也和{a:1,b:2,c:'adsasdasd'}一样,我不想比较c。在我的上一篇文章中忘记提到了这一点。这似乎解决了我的问题,尽管我有第三个元素“c”。多谢!酷。请确保在查询上运行explain()s,以查看命中它的索引的性能。谢谢。幸运的是,我有另一个实现,它不需要调用这个查询。
db.items.find({x : { $all: [
  {$elemMatch: {a: 1, b: 2}}, 
  {$elemMatch: {a: 3, b: 4}}, 
  {$elemMatch: {a: 5, b: 6}}
    ]}}