2016-09-29 65 views
0

在收集test有文件如下的特定元素:查詢嵌套數組或默認

{a:1, list:[{lang:"en", value:"Mother"}, {lang:"de", value:"Mutter"}] } 
{a:2, list:[{lang:"en", value:"Iddqd"}] } 

我想是嘗試匹配list.value以所選語言生成的查詢,但如果它不存在,則返回任何-服務現有的list項目,因此,例如上述和查詢語言de我需要得到$projection爲:

{a:1, label:"Mutter"}, 
{a:2, label:"Iddqd"} //since no label matched 'de' let's select any available 

Server版本:MongoDB的3.2+

+1

請您詳細說明爲什麼您應該爲第二個文檔獲得「{a:2,label:」Iddqd「}? – styvane

+0

列表的最大長度是否等於2? – styvane

+0

@Styvane - 剛剛更新,簡稱「Iddqd」 - 是任何可用的項目。列表很短 - 不超過10 – Dewfy

回答

1

您需要過濾列表,使用$let運算符將結果賦值給變量。如果變量是空列表,則使用$arrayElemAt運算符返回給定值。在這種情況下,我只是返回第一個子文檔。

db.coll.aggregate([ 
    { "$project": { 
     "a": 1, 
     "label": { 
      "$let": { 
       "vars": { 
        "values": { 
         "$arrayElemAt": [ 
          { "$filter": { 
           "input": "$list", 
           "as": "lst", 
           "cond": { "$eq": [ "$$lst.lang", "de" ] } 
          }}, 
          0 
         ] 
        } 
       }, 
       "in": { 
        "$ifNull": [ 
         "$$values.value", 
         { "$let": { 
          "vars": { 
           "default": { 
            "$arrayElemAt": [ "$list", 0 ] 
           } 
          }, 
          "in": "$$default.value" 
         }} 
        ] 
       } 
      } 
     } 
    }} 
]) 
+0

不知道爲什麼,但$ filter返回包含'de'和'en'的數組的兩個項目 – Dewfy

+0

@Dewfy我更新了我的答案。有一點時間會增加更多的解釋。 – styvane