MongoDB Upserts变量名称作为键(Node.JS)

时间:2016-05-16 20:00:38

标签: node.js mongodb variables key

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'}]);
        });
    });
}

1 个答案:

答案 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'}]);
    });
});