簡體   English   中英

在嵌套子文檔中使用$ unwind

[英]Using $unwind with nested subdocuments

我有一個具有以下結構的集合:

{
   {
     node: 'ST20'
     Ds:{
          699:{
                   TotCM: 300
                   Docsis20: 200
                   Docsis30: 100
              }
          705:{
                   TotCM: 250
                   Docsis20: 150
                   Docsis30: 100
              }

        }
   }
   {
     node: 'ST21'
Ds:{
          651:{
                   TotCM: 200
                   Docsis20: 100
                   Docsis30: 100
              }
          699:{
                   TotCM: 100
                   Docsis20: 0
                   Docsis30: 100
              }

        }
   }
}

如您所見,我有一個代表節點的文檔。 每個節點具有不同的通道。 我的目標是查看每個通道中有多少個電纜調制解調器。 從頭開始,我不知道我在每個節點中擁有的渠道。 所以我想要這樣的東西:

{ node: 'ST20', Ds: 699, TotCM: 300, Docsis20: 200, Docsis30:100 }
{ node: 'ST20', Ds: 705, TotCM: 250, Docsis20: 150, Docsis30:100 }
{ node: 'ST21', Ds: 651, TotCM: 200, Docsis20: 100, Docsis30:100 }
{ node: 'ST21', Ds: 699, TotCM: 100, Docsis20: 0,   Docsis30:100 }

我嘗試了以下查詢:

db.statsNodos.aggregate(
{ $project: {_id:0,Ds:1,node:1}},
{ $unwind: "$Ds"}
).pretty()

但是我得到了原始文件。 而且,如您所見,它們是嵌套文檔,而不是文檔數組。 也許我不必使用$unwind ,還有另一種方式來實現這一點。 你能告訴我嗎?

給定您的示例文檔結構:

{ node: 'ST21', 
  Ds: {
       "651":{ TotCM: 200, Docsis20: 100, Docsis30: 100 },
       "699":{ TotCM: 100, Docsis20: 0, Docsis30: 100 }
       }
}

您可以利用運算符$ objectToArray將字段channels名稱轉換為值。 例如:

{"$project": {
               "_id": 0, 
               "node": 1, 
               "tmp": { "$objectToArray": "$Ds" }
             }
}, 
{"$unwind": "$tmp" }, 
{"$project": { 
               "node": 1, 
               "Ds": "$tmp.k", 
               "TotCM": "$tmp.v.TotCM", 
               "Docsis20": "$tmp.v.Docsis20", 
               "Docsis30": "$tmp.v.Docsis30"
             }
}

我還建議重新考慮您的MongoDB數據架構,以簡化查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM