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]来访问数组的第一个块,但是会抛出错误......'意外的令牌['
我已经尝试了各种方法,并通过各种文档挖了几个小时,并且已经搜索了其他有这个问题的人,但是对于其他人来说似乎没有很好的记录问题。
任何人都有任何建议,以确保所有字段都在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'}]);
});
});
}
答案 0 :(得分:1)
执行此操作时:
{
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'}]);
});
});