Node.js 尝试将新数据传递给对象,而不使用express替换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

我试图在不使用nodejs替换旧数据的情况下将新数据传递给对象。我的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的详细信息和值

我的代码的最终结果是,它只是替换了“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代码生成器自动生成的,尽管我认为我可以解决这个问题!谢谢你的帮助!