2016-11-27 51 views
0

我的文檔如下所示(忽略了這個問題的時間點):子文檔的總陣列成單一的文件

{ 
    "_id": "xyz-800", 
    "site": "xyz", 
    "user": 800, 
    "timepoints": [ 
     {"timepoint": 0, "a": 1500, "b": 700}, 
     {"timepoint": 2, "a": 1000, "b": 200}, 
     {"timepoint": 4, "a": 3500, "b": 1500} 
    ], 
    "groupings": [ 
     {"type": "MNO", "group": "<10%", "raw": "1"}, 
     {"type": "IJK", "group": "Moderate", "raw": "23"} 
    ] 
} 

我可以拼合(也許不是正確的術語),因此groupings是一個單一的文件內。我想結果是這樣的:

{ 
    "id": "xyz-800", 
    "site": "xyz", 
    "user": 800, 
    "mnoGroup": "<10%", 
    "mnoRaw": "1", 
    "ijkGroup": "Moderate", 
    "ijkRaw": "23" 
} 

在現實中我想mnoGroupmnoRaw屬性如果屬性groupings.type = "MNO"存在與否要創建不管。與ijk屬性相同。

回答

1

您可以使用$arrayElemAt讀取由索引分組數組中的第一個項目階段和$ifNull在最後階段工程項目可選值。 Litte詳細,但會看看我能做些什麼。

db.groupmore.aggregate({ 
    "$project": { 
     _id: 1, 
     site: 1, 
     user: 1, 
     mnoGroup: { 
      $arrayElemAt: ["$groupings", 0] 
     }, 
     ijkGroup: { 
      $arrayElemAt: ["$groupings", -1] 
     } 
    } 
}, { 
    "$project": { 
     _id: 1, 
     site: 1, 
     user: 1, 
     mnoGroup: { 
      $ifNull: ["$mnoGroup.group", "Unspecified"] 
     }, 
     mnoRaw: { 
      $ifNull: ["$mnoGroup.raw", "Unspecified"] 
     }, 
     ijkGroup: { 
      $ifNull: ["$ijkGroup.group", "Unspecified"] 
     }, 
     ijkRaw: { 
      $ifNull: ["$ijkGroup.raw", "Unspecified"] 
     } 
    } 
}) 

樣本輸出

{ "_id" : "xyz-800", "site" : "xyz", "user" : 800, "mnoGroup" : "<10%", "mnoRaw" : "1", "ijkGroup" : "Moderate", "ijkRaw" : "23" } 
{ "_id" : "ert-600", "site" : "ert", "user" : 8600, "mnoGroup" : "Unspecified", "mnoRaw" : "Unspecified", "ijkGroup" : "Unspecified", "ijkRaw" : "Unspecified" } 
+0

謝謝你的建議。我添加了一個過濾器,並採取了第一個元素,所以我們沒有硬編碼。 'mnoGroup:{$ arrayElemAt:[{$ filter:{input:「$ cohorts」,as:「cohort」,cond:{$ eq:[「$$ cohort.cohortType」,「MNO」]}}},0 ]},' –

+0

是的,我昨天晚上想到的只是今天早上忘了。對於那個很抱歉。 – Veeram

+0

不用擔心。你指出我正確的方向,然後我開始鍛鍊我的大腦。我想我剛剛在MongoDB的三年級畢業。在新的冒險之上。 –