2013-03-02 45 views
3

我有以下結構的文檔:Mongodb:找到至少有一個數組元素匹配的文檔?

[{ 
    "items": [ 
     { 
      "sent_to_lab": 123, 
      "received_from_lab": 456, 
     }, 
     { 
      "sent_to_lab": 123, 
     }, 
    ] 
} 
... more orders ... 
] 

我想取其中至少一個項下列條件匹配的所有訂單:

'$and': [ 
    {'items.sent_to_lab': {'$exists': True}}, 
    {'items.received_from_lab': {'$exists': False}}, 
] 

因此,在這種情況下,我會喜歡返回上述項目,因爲至少有一個items數組元素符合我的標準。

我該如何在mongo中做到這一點?

回答

7

您需要使用$ elemMatch操作:

db.collection.find({items: 
        {$elemMatch:{ 
          sent_to_lab:{$exists:true}, 
          received_from_lab:{$exists:false}} 
}) 

這是查詢$ elemMatch - 如果你只是想找回那種匹配的條件的項目(而不是與整個陣列整個文檔)那麼您可以同樣使用投影$ elemMatch運算符。

+0

這非常有幫助,謝謝!在這種情況下,我確實需要整個文檔。但似乎我現有的查詢確保數組中的* all *元素與條件匹配,而不是實際上「一個或多個」 – poundifdef 2013-03-02 03:26:30

+0

,這不是數組在MongoDB中的工作方式。您的查詢表示返回任何子文檔已發送到任何文檔,並且任何子文檔都沒有received_from_lab。這意味着您的查詢將返回包含兩個子文檔的文檔,一個是已發送和已接收的文檔,另一個是兩個都沒有(!)elemMatch將它們合併,以便它們應用於相同的子文檔,這正是我理解您的用例的原因。 – 2013-03-02 12:45:55

+0

經過一番搗鼓之後,我發現你是對的,'$ elemMatch'正是我所期待的。非常感謝它。 – poundifdef 2013-03-04 19:42:12

相關問題