Mongodb - 更新对象数组中每个对象的属性,如果不存在,则插入

时间:2018-03-30 14:17:00

标签: javascript node.js mongodb

我希望更新对象数组中每个对象的属性,但如果某些对象不存在,请插入对象。

目前我使用“upsert”,当没有文档与查询匹配时会创建一个新文档,不幸的是它正在用我的整个列表替换单个项目。

值得一提的是我正在使用mongoist来执行异步请求。

我的代码:

    this.tokenArray = [
 { token: "654364543" },
 { token: "765478656" },
 { token: "876584432" },
 { token: "125452346" },
 { token: "874698557" },
 { token: "654364543" }
 ]

 database.upsertDatebaseItem(this.tokenArray.map(x => { return x.token }), { valid : true }, 'Tokens');


 async upsertDatebaseItem(itemKey, itemValue, collectionName) {
    try {
        await this.database[collectionName].update({ token : { $in: itemKey}}, { $set: itemValue }, {upsert : true} , {multi : true});
    } catch (error) {
        console.log(`An error occurred while attempting to update ${itemType} to the database: ${error}`);
        return false;
    }
 }

2 个答案:

答案 0 :(得分:0)

找到了做到这一点的方法:

const bulkUpdate = this.tokenArray.map((x) => {
            return {
                "updateOne": {
                    "filter": { "token": x.token },
                    "update": { "$set": { "valid": true } },
                    "upsert": true
                }
            };
        });

this.database[collectionName].bulkWrite(bulkUpdate);

答案 1 :(得分:0)

要使用 mongoist 进行更新插入,请使用以下内容:

var bulk = db.collection.initializeOrderedBulkOp()
for(var doc of docs) bulk.find( { _id: doc._id } ).upsert().updateOne(doc); // or use replaceOne()
await bulk.execute();

转换为您的情况

var bulk = db.collectionName.initializeOrderedBulkOp()
for(var tokenItem of tokenArray) bulk.find( { token : tokenItem.token } ).upsert().updateOne(tokenItem); // or use replaceOne()
await bulk.execute();