Details
-
Question
-
Status: Closed
-
Major - P3
-
Resolution: Done
-
None
-
None
-
None
Description
I want to replace the collection field based on a map table, like
old_src | new_src |
---|---|
1 | 448 |
5 | 449 |
... | ... |
So I write a very simple JavaScript.
db_name = 'mydb' |
collection_name = 'mycoll' |
|
src_map = [
|
[1,448],
|
[5,449],
|
[6,450],
|
[8,451],
|
[9,452],
|
[10,453],
|
[11,454],
|
[12,455],
|
[14,456],
|
[15,457],
|
[16,458],
|
[17,459],
|
[18,460],
|
[20,461],
|
[22,462],
|
[23,463],
|
[24,464],
|
[25,465],
|
[26,466],
|
[27,467],
|
[29,468]
|
]
|
|
db = db.getSiblingDB(db_name)
|
for (x in src_map) { |
old2new_map = src_map[x];
|
print("Changing src: " + String(old2new_map[0]) + " --> " + String(old2new_map[1]) + " ... "); |
db[collection_name].update({"src":old2new_map[0]},{$set:{"src":old2new_map[1]}},{multi:true}); |
print("Done.") |
}
|
I use update function within a for loop to do this. But it's so slow. This collection contains more than 1000000 objects, and each update will execute more than 10 mins(even if src field has a index).
How to optimize this script? Is there any way to update the whole may in a single function? Or use multi thread way to let the update function parallelly?