2016-09-29 90 views
1

基於this問題...

我試圖讓一個聚合函數和篩選基於子陣值我的數組。目前我的陣列結構如下:

'id':1, 
'data': { 
    'value':1  
} 
'id':2, 
'data': { 
    'value':1  
} 
'id':3, 
'data': { 
    'value':2  
} 

所以我需要讓所有的物品,其中data.value爲1。目前爲了做到這一點我必須做到以下幾點:

db.ids.aggregate([ 
{$match:{id:{$exists:true}}}, //some more matching conditions here... 
{$unwind:'$data'}, 
{$match:{'data.value':1}}//need to get rid of this and move it to the first $match 

所以問題是我可以擺脫第二個$匹配,並將我的子數組過濾條件放入第一個匹配中?我試圖做到這一點,但它沒有奏效,並返回了整個文檔。我真的需要根據子數組值過濾我的數組,因爲我的數據庫會變得非常大,我不希望$放鬆整個文檔。 謝謝。

+1

請問您可以添加一個整個文檔的例子,因爲它目前不清楚(至少不是我)你的文檔是怎麼樣的 - 我目前不確定你顯示的數據應該代表3個文檔還是一個文檔包含這3個子文檔的嵌套數組。 – DAXaholic

回答

-1

嘗試如下:

db.ids.aggregate([ 
{$match:{id:{$exists:true}}, 'data.value':1}, 
{$unwind:'$data'} 
+0

我已經試過了,它沒有幫助。它仍然返回所有沒有過濾器的數據。它僅在$ unwind – Jack

+0

@Jack後面使用$ match時過濾@Jack您的意思是它返回的值爲2的數據,即data.value:2個記錄? – Sachin

+0

是的,它也返回data.value:2,雖然我明確表明我只需要'data.value':1。那是這樣的情況 – Jack

0

你可以在第一場比賽本身添加多個條件。

db.ids.aggregate([ 
    {$match:{id:{$exists:true}, "data.value": 1}} 
]) 

然後做你的放鬆。

+0

也沒有幫助不幸。我也嘗試用$和添加多個條件,但它也不起作用。 – Jack

+0

您將需要用您的模式中的任何內容替換data.value。 我正在查看您的鏈接問題,其中的數據數組位於services.TCP80.data。在這裏,你提到數據數組中的項目,但它看起來不像一個數組。如果你能提供一個樣本文件,可能會有所幫助。 – sudheeshix