2016-06-08 61 views
1

我有一個相當複雜的文檔,但這裏是我可以放在這裏的示例。從基於過濾器的數組投影文件cond

我有「地址」陣列上的多個地址的文件類似

addresses : [ 
      {'code': '1', line:'abc town'}, {'code':'2', line:'bcd town'},{'code':'3', line: 'another town'} 

]

,我想拉基於代碼的文檔。例如碼:1然後就拉這一個文件,如果不看是否有碼:2,是再拉這個文件,否則扯別的可

我的文檔結構看起來像這樣

[ 
_id:123 
    fn: 'name', 
    addresses : [ 
       {'code': '1', line:'abc town'}, {'code':'2', line:'bcd town'},{'code':'3', line: 'another town'} 
] 

]

和我寫的查詢是

db.collection.aggregate([{$match: {'_id':123}}, 
{$project: { 
"fn" :1, 
    "addresses": {$filter: { 
     input: '$addresses', 
     as: 'address', 
     cond: {$eq: ['$$address.code', '1']} 
    }}, 
    _id: 0 
}} 

它工作時的代碼是等於1(明顯),但我不知道該怎麼辦,「如果其他」條件我需要的我上面解釋過,即如果代碼== 1,然後只拉該文檔,如果不看看代碼== 2,然後拉動該文檔,如果不是所有其他東西拉可用。

我知道這是很複雜的解釋,但我認爲我需要一些修復我的$過濾條件。

任何幫助,將不勝感激

+0

這應該讓你在正確的軌道上: https://docs.mongodb.com/manual/reference/operator/aggregation/cond/ – Tiramisu

+0

嘿感謝您的鏈接。我確實認爲我處於正確的軌道,這只是我無法做到$過濾條件中的if else。如果你能糾正我所犯的錯誤。 – JBone

+0

JohnnyHK ..有什麼機會,你看過這個嗎? – JBone

回答

0

我不知道這是否會工作,我也不知道你想執行什麼比較。如果你給我這些信息,我會重新創建數據集並在我的最後嘗試。

db.collection.aggregate([{$match: {'_id':123}}, 
{$project: { 
"fn" :1, 
    "addresses": {$cond: { 
     if: {$eq: ["YOUR_EXPRESSION": 1]}, 
     then: "addresses.0.line", 
     else: "addresses.1.line" 
    }}, 
    _id: 0 
}}