2013-06-19 45 views
1

我有以下記錄的嵌套陣列上執行與操作:如何在MongoDB中的查詢對象

Record 1: 
{ 
    "status": "active", 
    "users": [ 
     { 
      "name": "foo", 
      "status": "a" 
     }, 
     { 
      "name": "foo", 
      "status": "b" 
     }   
    ] 
} 

Record 2: 
{ 
    "status": "active", 
    "users": [ 
     { 
      "name": "bar", 
      "status": "a" 
     }, 
     { 
      "name": "foo", 
      "status": "b" 
     }   
    ] 
} 

現在,我想返回只記錄其中user.name是「富」和user.status是「一」 - 這就是我需要記錄1回,因爲它滿足我的要求。

如何對記錄中的數組執行AND操作? 我嘗試以下查詢:

{ 
    "$and": [ 
     { 
      "users.name": "foo" 
     }, 
     { 
      "users.status": "a" 
     } 
    ] 
} 

,但我得到兩個記錄 - 我只需要在第一個記錄(因爲用戶陣列中,它有一個條目,其中名稱是「富」,狀態爲「一個」)。

任何線索?

回答

3

好吧,我找到了答案了here

的解決辦法是有一個查詢,如下所示:

{ 
    "users": { 
     "$elemMatch": { 
      "name": "foo", 
      "status": "a" 
     } 
    } 
} 

這奏效了!

0

除了單個字段值,您還可以在查詢查詢中使用整個對象。嘗試:

db.collection.find({ 
    users: { 
     "name":"foo", 
     "status":"a" 
    } 
}); 

這應返回其中用戶陣列包括一個對象(或是一個對象)所描述的,看起來所有文檔。但需要注意的是,當物體具有額外的字段,這並不工作。

+0

所以你的意思是說,如果用戶數組包含對象,並且這些對象包含'name'和'status'以外的字段,那麼上述查詢將不起作用?在我的情況下,是的 - 對象包含除上述兩個等領域,但我不希望將其包含在查詢 - 我該如何去做呢? – callmekatootie

+0

使用$ elemMatch像你已經想通了。 –

+0

@Philipp請注意,您的答案將無法正常工作 - 它只會匹配*確切*對象{「名」:「富」,「狀態」:「一」} - 它甚至不會匹配用戶有這兩個字段以相反的順序! –