2017-08-02 21 views
1

如何在MongoDB中動態添加字段?我有一個數組,我想創建列。例如,從這個,從陣列內容動態添加密鑰

/* 1 */ 
{ 
    "date" : "2017-07-30", 
    "brand" : [ 
     { 
      "name" : "Apple", 
      "quantity" : 31 
     } 
    ], 
    "total" : 31 
} 

/* 2 */ 
{ 
    "date" : "2017-08-02", 
    "brand" : [ 
     { 
      "name" : "Apple", 
      "quantity" : 1 
     }, 
     { 
      "name" : "Samsung", 
      "quantity" : 6 
     } 
    ], 
    "total" : 7 
} 

我想使這個,

/* 1 */ 
{ 
    "date" : "2017-07-30", 
    "Apple": 31, 
    "Samsung": 0, 
    "total" : 31 
} 

/* 2 */ 
{ 
    "date" : "2017-08-02", 
    "Apple": 1, 
    "Samsung": 6, 
    "total" : 7 
} 

$addFields運營商可以添加一個字段,但我該如何使用它的多個字段?

+0

有東西,你相信沒有解決您的問題提供答案嗎?如果是這樣,請評論答案以澄清究竟需要解決的問題。如果它確實回答了你問的問題,那麼請注意[接受你的答案](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)給你的問題要求 –

+0

非常抱歉。 – emtiajium

回答

0

你可以這樣做,但老實說這是一種浪費。使用$replaceRoot$arrayToObject,你就會明白:

db.collection.aggregate([ 
    { "$replaceRoot": { 
    "newRoot": { 
     "$arrayToObject": { 
     "$concatArrays": [ 
      [{ "k": "date", "v": "$date" }], 
      { "$map": { 
      "input": "$brand", 
      "as": "b", 
      "in": { "k": "$$b.name", "v": "$$b.quantity" } 
      }}, 
      [{ "k": "total", "v": "$total" }] 
     ] 
     } 
    } 
    }} 
]) 

它實際上是好了很多簡單地從光標變換。作爲外殼:

db.collection.find().map(doc => 
    Object.assign(
    { date: doc.date }, 
    doc.brand.map(d => ({ [d.name]: d.quantity })) 
     .reduce((acc,curr) => Object.assign(acc,curr),{}), 
    { total: doc.total } 
) 
) 

哪個做同樣的事情:

[ 
    { 
     "date" : "2017-07-30", 
     "Apple" : 31.0, 
     "total" : 31.0 
    }, 
    { 
     "date" : "2017-08-02", 
     "Apple" : 1.0, 
     "Samsung" : 6.0, 
     "total" : 7.0 
    } 
]