我试图在mongo db shell上进行批量写操作。我试图将每个文档的两个属性合并为一个新属性(sender.street + sender.houseNumber = sender.addressLine1)
因为即使在我们的登台服务器上也有超过7000个文件需要更新,所以我认为使用批量操作是一个好主意。到目前为止,这是我的剧本:
// select street + housenumber into new temporary collection
var senderLine1 = db.getCollection('mailItem').aggregate([
{ $project: { addressLine1: { $concat: [ "$sender.street", " ", "$sender.houseNumber"] } } }
]);
var bulkOps = [];
// collect all operations into array
senderLine1.forEach(
function(line1) {
bulkOps.push({
updateOne: {
"filter" : { "_id" : line1._id },
"update" : { $set : { "sender.addressLine1" : line1.addressLine1 } }
}
});
}
);
try {
db.mailItem.bulkWrite(bulkOps, { ordered : false });
} catch (e) {
print(e);
}
现在我希望看到一个BulkWriteError
对象,但我在Robo3T结果视图中得到的只是Error: error doing query: failed
。
选择似乎进展顺利,我可以看到结果。我也可以打印数组,生成的操作看起来很好。例如:
{
"updateOne" : {
"filter" : {
"_id" : "bc3f65bd-5c32-4577-a57a-1c7665e1984b"
},
"update" : {
"$set" : {
"sender.addressLine1" : "someStreet 123"
}
}
}
}
如果我执行它正常工作的那个:
db.mailItem.bulkWrite(
[
{ "updateOne" :
{
"filter" : {"_id" : "bc3f65bd-5c32-4577-a57a-1c7665e1984b" },
"update" : { "$set" : { "sender.addressLine1" : "someStreet 123" } }
}
}
])
只是批量没有执行。我真的不知道为什么会这样,因为我没有收到任何错误。
修改
对于减少数量的文件(如100),这运行得很好。它开始在500左右失败,所以看起来根本问题围绕着超时或其他有限的资源。
然而,获得一个我可以使用而不是Error: error doing query: failed
的ErrorOjbect也会很好。这可能是Robo3T的一个问题吗?