2011-04-20 98 views
12
> 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

谢谢。

+0

检查$ elemMatch [文档](http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24elemMatch)。 – 2011-04-20 19:10:24

回答

6

我认为这就是$ elemMatch是为...

the docs使用$ elemMatch查询运算符,你可以在阵列内匹配整个文档。

这听起来不像你要找的东西。

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

这听起来像你想搜索“一切都在对象‘C’为‘E1’的实例”

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

  • 覆盖率为对象,点表示法:db.test.find({'a.b.c.d1' : 'e1'})
  • 通读阵列:`db.test.find({ 'ABCD4': 'E5'})

它听起来你正在寻找能够同时完成这两项任务的能力。你想在同一个查询中“进入对象”和“通读数组”。

不幸的是,我不知道这样的功能。你可能想为此file a feature request

+1

谢谢,我做了[请求功能](https://jira.mongodb.org/browse/SERVER-2989)。 – trope 2011-07-04 15:02:34

+1

您的文档链接需要登录。 – Ixx 2013-08-25 21:20:02

2

Trope,你有没有找到你的问题的答案?

我相信你正在寻找的查询

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

要你的功劳,你非常接近!

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

+0

是的,这个查询的工作原理,但我正在寻找一种方法来搜索嵌套对象的键或值,当你不知道中间键(在这种情况下是'b')是什么。 – trope 2011-07-04 15:03:46

+1

我[提交了一项功能请求](https://jira.mongodb.org/browse/SERVER-2989),希望这个功能很快就能发布。 – trope 2011-07-04 15:04:53