尝试将新数据传递给一个对象,而不使用expressreplacemongoDB中的旧数据

我正在尝试将新数据传递给对象,而不使用nodejsreplace旧数据。 下面是我的Mongodb数据库(添加新数据之前)的结构

{ "_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)replace它。

我希望有两个数据保持。 在“交易”下添加新的内容而不删除旧的内容

好吧,假设你总是会有一个对象在req.body有一个键。 喜欢:

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数据仍然存在。

您应该更新您的结构到Transaction数组,而不是创builddynamic密钥。

当你想通过使用位置操作符来引用来更新单个字段时,这将对你有所帮助。

所以你应该改变你的结构

 { "_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}); });