2013-08-31 228 views
0

讓我直接回答這個問題,OK我有文檔結構如查詢嵌入式文檔MongoDB

讓集合名稱爲sample;

我不會知道someIdAsString。

{ 
_id : ObjectId("someObjectId"), 
test : { 
    someIdAsString : { 
     field1 : value1, 
     field2 : value2 
    }, 
      someOtherIdAsString : {} 
      ..... 
      ..... 
      And so on 
    } 
} 

我有FIELD1 & FIELD2值如何查詢使用該信息的收集。

字段1 &場2會在運行時被稱爲可以說,這是字段1 =「33」 &場2 =「3333」和像

{ 
_id : ObjectId("522182515f8wea670900001b"), 
test : { 
    522182515f8c4wd70900001b : { 
    field1 : '33', 
    field2 : '3333' 
    }, 
     522182515f8cea670900001b : {} 
     ..... 
     ..... 
     And so on 
    } 
} 

感謝

+1

請舉一個實際的收集數據和預期的結果。 –

+0

實際上查詢的程序的一部分會使事情變得更加清晰。 – thefourtheye

+0

FIELD1&FIELD2將在運行時被稱爲 可以說這是FIELD1 = '33' &FIELD2 = '3333' 和類似 '{ _id文檔:的ObjectId( 「5221828c5f8cea670900as1d」), 測試:{ 5221828c5f8cea670900001d :{ 字段1: '33', 場2: '3333' }, 5221828c5dscea670900001d:{} ..... ..... 等等 }} ,' – Beast

回答

1

的文件,我建議你更改架構,以便此someIdAsString文本成爲一個值而不是一個鍵,使test中的對象成爲對象列表。如果你知道每一個鍵,你可以嘗試

db.sample.find({$or: [ 
    {"test.someIdAsString.field1": value1, 
    "test.someIdAsString.field2": value2}, 
    {"test.someOtherIdAsString.field1": value1, 
    "test.someOtherIdAsString.field2": value2}, 
    ... 
]}) 

對於所有「someIdAsString」的可能性。

如果更改結構:

{ 
    _id : ObjectId("someObjectId"), 
    test : [ 
     { 
      _id : someIdAsString, 
      field1 : value1, 
      field2 : value2 
     }, 
     { 
      _id : someOtherIdAsString, 
      field1 : value3, 
      field2 : value4 
     }, 
     ... 
    ] 
} 

您可以查詢更改爲:

db.sample.find({ 
    "test.field1": value1, 
    "test.field2": value2 
}) 

一種解決方法,同時仍然使用你的數據結構使用查詢不知道嵌入式鍵名將是$where operator中的JavaScript。

db.sample.find(function(){ 
    var ttk; 
    var tt = this.test; 
    for(key in tt){ 
     ttk = tt[key] 
     if(ttk.field1 === value1 && ttk.field2 === value2){ 
      return true; 
     } 
    } 
    return false; 
}) 
+0

謝謝@HD爲你的時間, 我想知道是否有方法來使用mongoskin本身進行查詢,但我想我找到了答案,它不是我的猜測。 – Beast

+0

我最後一個例子中的函數可以像'{$ match:function(){...}}'或者'{$ match:「(function(tt){...})這樣使用。測試)「}'查詢,您可能可以在mongoskin的'collection.find'中使用這個查詢。 –