Node.js 尝试将新数据传递给对象,而不使用express替换nodejs中mongoDB中的旧数据
我试图在不使用nodejs替换旧数据的情况下将新数据传递给对象。我的Mongodb数据库(添加新数据之前)结构如下Node.js 尝试将新数据传递给对象,而不使用express替换nodejs中mongoDB中的旧数据,node.js,mongodb,express,mongodb-query,Node.js,Mongodb,Express,Mongodb Query,我试图在不使用nodejs替换旧数据的情况下将新数据传递给对象。我的Mongodb数据库(添加新数据之前)结构如下 { "_id" : ObjectId("58fd05f7fb69f42d54fccd12"), "Transaction" : { "QRIDNumber6666" : { "retailer" : "watson", "discount" : "10%", "tax" : "5%", "Transaction
{
"_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的详细信息和值
我的代码的最终结果是,它只是替换了“Transaction”(QRIDNumber6666)下的所有以前的内容,而只替换为新内容(QRIDNumber7777)
我希望保留这两个数据。在“Transaction”下添加新内容而不删除旧内容好的,因此假设在
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]
}
您只更新一个嵌套属性,而不是覆盖整个
事务文档。因此QRIDNumber6666
数据仍然保留。好的,假设在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]
}
您只更新一个嵌套属性,而不是覆盖整个事务文档。因此,QRIDNumber6666
数据仍然保留。您应该将结构更新为事务
数组,而不是创建动态键
这将有助于您以后使用位置运算符通过引用来更新各个字段
所以你应该改变你的结构
{
"_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添加到事务
数组中
app.put('/contactlist/', function (req, res) {
var id = "58fd05f7fb69f42d54fccd12";
db.CollectionName.findAndModify({
query: {_id: mongojs.ObjectId(id)},
update: {$push: {Transaction: req.body}},
new: true});
});
您应该将结构更新为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添加到事务
数组中
app.put('/contactlist/', function (req, res) {
var id = "58fd05f7fb69f42d54fccd12";
db.CollectionName.findAndModify({
query: {_id: mongojs.ObjectId(id)},
update: {$push: {Transaction: req.body}},
new: true});
});
如果新的QRID保证是新的,您可以在查询中使用点表示法,这样您就不会替换整个对象了吗<代码>更新:{$set:{[`Transaction.${req.body.id}`]:req.body},
我已经考虑过了,但问题是QRIDNumber(id)大部分是未知的,因为QRIDNumber的值将是动态和增量的,而不仅仅是QRIDNumber 6666和QRIDNumber 7777。谢谢你的帮助!如果新的QRID保证是新的,您可以在查询中使用点表示法,这样您就不会替换整个对象了吗<代码>更新:{$set:{[`Transaction.${req.body.id}`]:req.body},
我已经考虑过了,但问题是QRIDNumber(id)大部分是未知的,因为QRIDNumber的值将是动态和增量的,而不仅仅是QRIDNumber 6666和QRIDNumber 7777。谢谢你的帮助!谢谢,虽然在我的情况下,我不知道钥匙的名称,QRIDNumber实际上是由我的QR代码生成器自动生成的,尽管我认为我可以解决这个问题!谢谢你的帮助!谢谢,虽然在我的情况下,我不知道钥匙的名称,QRIDNumber实际上是由我的QR代码生成器自动生成的,尽管我认为我可以解决这个问题!谢谢你的帮助!