MongoDB查询帮助:嵌套对象中的$ elemMatch

时间:2011-04-20 19:03:26

标签: mongodb

> db.test.insert({"a" : { "b" : { "c" : { "d1" : [ "e1" ],
                                          "d2" : [ "e2" ], 
                                          "d3" : [ "e3", "e4" ], 
                                          "d4" : [ "e5", "e6" ] } } } })
> db.test.find({'a.b.c' : {$exists : true}})
{ "_id" : ObjectId("4daf2ccd697ebaacb10976ec"), "a" : { "b" : { "c" : { "d1" : [ "e1" ], "d2" : [ "e2" ], "d3" : [ "e3", "e4" ], "d4" : [ "e5", "e6" ] } } } }

但这些都不起作用:

> db.test.find({'a.b': "c"})
> db.test.find({'a.b': {$elemMatch : {"c" : {$exists: true}}}})
> db.test.find({'a.b': {$elemMatch : {$elemMatch : {$all : ["e1"] }}}})

假设我不知道cd1 ... d4的值是什么。是否有一种通用的方法来搜索嵌套对象的结构中的特定值?

我认为这就是$elemMatch的用途。

谢谢。

2 个答案:

答案 0 :(得分:6)

  

我认为这就是$ elemMatch的用途......

the docs使用$ elemMatch查询运算符,您可以匹配数组中的整个文档。

这听起来并不像你想要的那样。

  

是否有一种通用的方法来搜索嵌套对象的结构中的特定值?

听起来你想要搜索“对象'c'中的所有内容以获取'e1'的实例”

MongoDB支持两个相关的功能,但功能并不是你想要的。

  • 到达对象,点符号:db.test.find({'a.b.c.d1' : 'e1'})
  • 通读数组:`db.test.find({'a.b.c.d4':'e5'})

听起来你正在寻找能够同时做到这两点的能力。您希望在同一查询中“到达对象”和“通过数组读取”。

不幸的是,我不知道这样的功能。您可能需要file a feature request

答案 1 :(得分:2)

特洛佩,你有没有找到你问题的答案?

我相信您正在寻找的查询是

db.test.find({ 'a.b.c': { '$exists': true } });

值得赞扬的是,你非常接近!

无论如何,希望这有帮助!