gpt4 book ai didi

node.js - MongoDB 将变量名称更新为键 (Node.JS)

转载 作者:可可西里 更新时间:2023-11-01 10:42:20 26 4
gpt4 key购买 nike

Node.JS、MONGODB,不使用 Mongoose

我有一份正在保存的文件。当我使用 UPSERT 时,它按如下方式构建数据:

{ "_id" : ObjectId("573a123f55e195b227e7a78d"),
"document" :
[ {"name" : "SomeName" } ]
}

当我使用 INSERT 时,它会将其全部插入到根级别:

{ "_id" : ObjectId("573a123f55e195b227e7a78d"), "name" : "SomeName" }

这显然会导致很多不一致。我尝试过各种各样的事情。我尝试了各种方法,例如 findOneAndReplace、Update with Upsert、Replace、$setOnInsert。看起来,当涉及到 Upsert 时,这一切都做同样的事情。

我曾尝试使用 document[0] 访问数组的第一个 block ,但这会引发错误... 'Unexpected Token ['

我已经尝试了各种方法并在各种文档中挖掘了几个小时,并且到处搜索其他人遇到这个问题,但对于其他人来说似乎没有很好的记录问题。

有人有任何建议来确保所有字段都在 ROOT 级别,而不是嵌套在变量名下吗?相关代码如下。

findReplace: function(db, document, collection) {

var dbCollection = db.collection(collection);

var filter = document.name;

return new Promise(function(resolve, reject) {
dbCollection.updateOne({
"name" : filter
}, {
document
}, {
upsert: true
}, function(err, result) {
if (err) {
console.log('error', err)
reject(err);
}
console.log("Found Document and Upserted replacement Document");
resolve([{'status' : 'success'}]);
});
});
}

最佳答案

当你这样做时:

{ 
document
}

您正在创建一个包含 document 属性和变量值的对象:

{ 
document: [ {"name" : "SomeName" } ]
}

This is new functionality from ES6 .如果要访问文档变量的第一项,请不要创建新对象:

return new Promise(function(resolve, reject) {
dbCollection.updateOne({
"name" : filter
}, document[0], { // <========
upsert: true
}, function(err, result) {
if (err) {
console.log('error', err)
reject(err);
}
console.log("Found Document and Upserted replacement Document");
resolve([{'status' : 'success'}]);
});
});

关于node.js - MongoDB 将变量名称更新为键 (Node.JS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37262281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com