use*_*029 1 javascript mongodb
我想在myCollection的所有文档中添加一个名为"serie"的字段,其中包含一个序列整数,例如:
{"_id" : "507f191e810c19239de098db", "name" : "John", "serie" : "1"}
{"_id" : "507f191e810c19729de860ea", "name" : "Dave"}, "serie" : "2"}
{"_id" : "507f191e810c19729de564ou", "name" : "Kate"}, "serie" : "3"}
......
Run Code Online (Sandbox Code Playgroud)
objectId(_id)不会显示或通过humains记住,所以我想保留它并添加包含简单,短和唯一数字的其他字段'serie'来标识每个doc,如序列号.所以我尝试了以下脚本,但我在所有文档中都获得了相同的"serie"值:
for(var i=1; i < 543; i++){
db.myCollection.update({},
{ $set: {"serie": i}},
{ upsert:false, multi: true });
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助.
你在这里做的事情的问题基本上multi: true是你的陈述的一部分.基本上你说用这个数字更新"一切",543次.
要获得越来越多的数字,请执
var i = 1;
db.myCollection.find().forEach(function(doc) {
db.myCollection.update(
{ "_id": doc._id },
{ "$set": { "serie": i } }
);
i++;
)
Run Code Online (Sandbox Code Playgroud)
或者更快地使用MongoDB 2.6及更高版本的批次
var i = 1;
var cmd = {
"update": "myCollection",
"updates": []
};
db.myCollection.find().forEach(function(doc) {
cmd.updates.push({
"q": { "_id": doc._id },
"u": { "$set": { "serie": i } }
});
if ( batch.length % 500 == 0 ) {
db.runCommand(cmd);
cmd.updates = [];
}
i++;
});
if ( cmd.updates.length > 0 )
db.runCommand(cmd);
Run Code Online (Sandbox Code Playgroud)
因此,不仅因为没有在每次更新时提取写入确认而更快,而且因为它一次发送批量大小为500的更新.
| 归档时间: |
|
| 查看次数: |
2831 次 |
| 最近记录: |