2017-04-23 36 views
1

我試圖將新數據傳遞給對象而不使用nodejs替換舊數據。我的MongoDB數據庫(添加新數據之前)結構如下試圖將新數據傳遞給對象而不用mongoDB替換nodejs中的舊數據使用明文

{ 
"_id" : ObjectId("58fd05f7fb69f42d54fccd12"), 
"Transaction" : { 
    "QRIDNumber6666" : { 
     "retailer" : "watson", 
     "discount" : "10%", 
     "tax" : "5%", 
     "Transaction Detail" : [ 
      { 
       "quantity" : "1", 
       "pname" : "coca", 
       "price" : "3" 
      }, 
      { 
       "quantity" : "3", 
       "pname" : "pepsi", 
       "price" : "5" 
      } 
     ] 
    } 
} 
} 

我想要實現的是添加另一QRIDNumber下交易,例如:QRIDNumber 7777,相比QRIDNumber6666

時有不同的值,但相同的結構

我現在的嘗試是通過使用該的NodeJS下面的代碼

app.put('/contactlist/', function (req, res) { 
var id = "58fd05f7fb69f42d54fccd12"; 
db.CollectionName.findAndModify({ 
query: {_id: mongojs.ObjectId(id)}, 
update: {$set: {Transaction: req.body}}, 
new: true}); 
}); 

注:req.body是細節和QRIDNumber7777的值是從我的控制器發送。

我的代碼的最終結果是它僅替換了「事務」(QRIDNumber6666)下的所有以前的內容,並且僅用新內容(QRIDNumber7777)替換了它。

我希望兩個數據都保留。在「交易」下添加新內容而不刪除舊的內容

+0

如果新的QRID保證是新的,可以在查詢中使用點符號,這樣您就不會替換整個對象? 'update:{$ set:{[''Transaction。$ {req.body.id} \']:req.body}},' – chris

+0

我想到了它,但問題是QRIDNumber(id)會大多數情況下不會被稱爲QRIDNumber的值將是動態和增量的,而不僅僅是QRIDNumber 6666和QRIDNumber 7777.感謝您的幫助! –

回答

3

好的,假設您在req.body中始終有一個帶有1個鍵的對象。像:

req.body = {"QRIDNumber7777": {...}}

首先,你需要知道密鑰的名稱:

const insertedTransactionName = Object.keys(req.body)[0]; // QRIDNumber7777 

現在你可以不覆蓋其他領域的更新文檔。

app.put('/contactlist/', function(req, res) { 
    var id = "58fd05f7fb69f42d54fccd12"; 
    db.CollectionName.findAndModify({ 
     query: { 
      _id: mongojs.ObjectId(id) 
     }, 
     update: { 
      $set: { 
       [`Transaction.${insertedTransactionName}`]: req.body[insertedTransactionName] 
      } 
     }, 
     new: true 
    }); 
}); 

注意這一行:

$set: { 
    [`Transaction.${insertedTransactionName}`]: req.body[insertedTransactionName] 
} 

覆蓋整個Transaction文件相反的,你只更新一個嵌套屬性。所以QRIDNumber6666數據仍然存在。

+0

謝謝,雖然在我的情況下,我不會知道密鑰的名稱,QRIDNumber實際上是由我的QR碼生成器自動生成的,儘管我認爲我可以解決這個問題是可能的!謝謝您的幫助! –

1

你應該更新你的結構到Transaction數組而不是創建動態密鑰。

當您想要通過使用位置運算符進行引用來更新單個字段時,這將對您稍後有所幫助。

所以您應將結構改變

{ 
"_id" : ObjectId("58fd05f7fb69f42d54fccd12"), 
"Transaction" : [{ 
     "QRIDNumber": 6666, 
     "retailer" : "watson", 
     "discount" : "10%", 
     "tax" : "5%", 
     "Transaction Detail" : [ 
      { 
       "quantity" : "1", 
       "pname" : "coca", 
       "price" : "3" 
      }, 
      { 
       "quantity" : "3", 
       "pname" : "pepsi", 
       "price" : "5" 
      } 
     ] 
    }] 
} 

使用$push新進入7777加入到Transaction陣列。

app.put('/contactlist/', function (req, res) { 
var id = "58fd05f7fb69f42d54fccd12"; 
db.CollectionName.findAndModify({ 
query: {_id: mongojs.ObjectId(id)}, 
update: {$push: {Transaction: req.body}}, 
new: true}); 
}); 
相關問題