使用带有$ in的ID数组更新多个文档时出现问题

时间:2017-01-10 15:34:27

标签: mongodb mongodb-query

此查询正在完成工作:

db.collection.update(
    { "_id": oneIdProvided }, 
    { $inc: { "field": 5 } },{ upsert: true }
)

现在我想用不同的ID多次执行相同的操作,我认为好的方法是使用$ in,因此我尝试了:

db.collection.update(
    { "_id": { $in: oneArrayOfIds} }, 
    { $inc: { "field": 5 } },{ upsert: true }
)

问题是:如果数组中提供的ID之一不存在于集合中,则会创建一个新文档(这就是我想要的),但会将其归为自动ID,而不是使用我提供的ID而是寻找。

我看到的一个解决方案可能是首先使用我的ID数组(那些已存在的ID不会被修改)执行插入查询,然后使用upsert执行更新查询:false

您是否只在一个查询中看到了这样做的方法?

1 个答案:

答案 0 :(得分:2)

我们可以通过使用bulkWrite()方法执行多个写操作来完成此操作。

function* range(start, end, step) { 
    for (let val=start; val<end; val+=step)
        yield val
}

let oneArrayOfIds; // For example [1, 2, 3, 4]

let bulkOp = oneArrayOfIds.map( id => { 
    return { 
        "updateOne": { 
            "filter": { "_id": id }, 
            "update": { "$set": { "field": 5 } }, 
            "upsert": true 
        }
    };
});

const limit = 1000;
const len = bulkOp.length;

let chunks = [];
if (len > 1000) {
    for (let index of range(0, len, limit)) {
        db.collection.bulkWrite(bulkOp.slice(index, index+limit));
    }
} else {
    db.collection.bulkWrite(bulkOp);
}