2011-04-20 101 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