2015-09-07 105 views
3

我有一個用戶模式是這樣的:

user : { 
     myArmy : { 
      mySoldiers : [ 
       { 
        positioned : false, 
        soldierInfo : { 
         _id : s99212 
        } 
       }, 
       { 
        positioned : true, 
        soldierInfo : { 
         _id : s99112 
        } 
       } 
      ] 
     } 
    }, 
    user : { 
     myArmy : { 
      mySoldiers : [ 
       { 
        positioned : true, 
        soldierInfo : { 
         _id : s99212 
        } 
       }, 
       { 
        positioned : false, 
        soldierInfo : { 
         _id : s99112 
        } 
       } 
      ] 
     } 
    } 

    ... 

我有我想要做回誰已經戰士ID s99212定位用戶(S)(真)查詢:(可能是成千上萬的那些,我需要閱讀和檢索它們全部)

這是我與貓鼬故障查詢:

var soldierId = s99212; 


stream = User.find({ 
      $and: [ 
       {'myArmy.mySoldier.positioned': {$ne: null}}, 
       {'myArmy.mySoldier.soldierInfo._id': soldierId} 
      ] 
     }).lean(true).stream(); 

沒有被該查詢返回的,應該有另一種方式來做到這一點$之類的東西?

究竟是如何我想使用$ elemMatch,如果在所有,它應該而不是發現? (如果它值得一提的,我想回到完整的用戶對象,不只是它的一部分...)

試過,墜毀我的應用程序:

stream = User.find({ 
     '$elemMatch': [ 
      {'myArmy.mySoldiers.pos': {$ne: null}}, 
      {'myArmy.mySoldiers.soldierInfo._id': soldierId} 
     ] 
    }).lean(true).stream(); 

我知道我有一個小小的語法問題在哪裏?

+0

[只檢索MongoDB集合中對象數組中的查詢元素]的可能重複(http://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array -in-mongodb的收集)。在查詢中使用'$ elemMatch'解決方案需要應用於相同的數組元素。這就是'$ elemMatch'所做的。 –

+0

我不認爲$ elemMatch應該在我的情況下,我需要完整的用戶對象,如果士兵身份證是由這個結構定位,你會介意讓我直嗎? – totothegreat

+0

您正在閱讀的錯誤答案。查看文檔中的['elemMatch'](http://docs.mongodb.org/master/reference/operator/query/elemMatch/),然後再查看答案。請記住,「你」是要求知道更好的人的建議的人。 'elemMatch'是你在這裏需要匹配元素上的兩個屬性。不以任何方式改變對象。 –

回答

3

非常簡單,有據可查。所述$elemMatch操作者作爲「本身查詢」,在那裏,它適用「它的條件」所指定的數組的成員:

var query = User.find({ 
    "myArmy.mySoldiers": { 
     "$elemMatch": { 
      "positioned": { "$ne": null }, 
      "soldierInfo._id": soldierId 
     } 
    } 
}); 

因此爲一個文件以「匹配」然後$elemMatch下specfied的條件必須存在並對「相同」數組元素有效。 「左」的數組,「右」的參數。

其他「點符號」形式只有曾測試數值與數組中的「某個元素」相匹配,而不一定是相同的。

+0

我愛你!我只是忘了那些:myArmy.mySoldiers, – totothegreat

+0

@totothegreat如何回到並在你的[其他問題](http://stackoverflow.com/q/32433412/5031275)有一個「紅熱去」。現在你對語法有了更多的瞭解,它應該很容易解決。或者至少得到「一部分」的方式。 –

+0

你是對的,現在第2部分開始,給我幾個即時通訊要爲你建立另一支軍隊 – totothegreat