Cách tối ưu trong MongoDB phiên bản 3.4.
Phiên bản này của mongod
cung cấp $ split
toán tử, tất nhiên sẽ chia chuỗi như được hiển thị tại đây
.
Sau đó, chúng tôi chỉ định giá trị mới được tính cho một biến bằng cách sử dụng $ let
toán tử biến. Sau đó, giá trị mới có thể được sử dụng trong in biểu thức để trả về giá trị "name" và "age" bằng cách sử dụng $ arrayElemAt
toán tử để trả về phần tử tại một chỉ mục xác định; 0
cho phần tử đầu tiên và -1
cho phần tử cuối cùng.
Lưu ý rằng trong trong biểu thức chúng ta cần tách phần tử cuối cùng để trả về chuỗi số nguyên.
Cuối cùng, chúng ta cần lặp lại Con trỏ
và ép kiểu chuyển đổi chuỗi số nguyên thành số bằng cách sử dụng Số
hoặc parseInt
và sử dụng hoạt động hàng loạt và BulkWrite ()
phương thức đến $ set
giá trị cho các trường đó để đạt hiệu quả tối đa.
let requests = [];
db.coll.aggregate(
[
{ "$project": {
"person": {
"$let": {
"vars": {
"infos": { "$split": [ "$person", "," ] }
},
"in": {
"name": { "$arrayElemAt": [ "$$infos", 0 ] },
"age": {
"$arrayElemAt": [
{ "$split": [
{ "$arrayElemAt": [ "$$infos", -1 ] },
" "
]},
-1
]
}
}
}
}
}}
]
).forEach(document => {
requests.push({
"updateOne": {
"filter": { "_id": document._id },
"update": {
"$set": {
"name": document.person.name,
"age": Number(document.person.age)
},
"$unset": { "person": " " }
}
}
});
if ( requests.length === 500 ) {
// Execute per 500 ops and re-init
db.coll.bulkWrite(requests);
requests = [];
}}
);
// Clean up queues
if(requests.length > 0) {
db.coll.bulkWrite(requests);
}
MongoDB 3.2 hoặc mới hơn.
MongoDB 3.2 không dùng nữa Bulk ()
cũ
API và các phương thức
được liên kết của nó và cung cấp BulWrite ()
nhưng nó không cung cấp $ split
vì vậy tùy chọn duy nhất mà chúng tôi có ở đây là sử dụng mapReduce ()
để chuyển đổi dữ liệu của chúng tôi, sau đó cập nhật bộ sưu tập bằng thao tác hàng loạt.
var mapFunction = function() {
var person = {},
infos = this.person.split(/[,\s]+/);
person["name"] = infos[0];
person["age"] = infos[2];
emit(this._id, person);
};
var results = db.coll.mapReduce(
mapFunction,
function(key, val) {},
{ "out": { "inline": 1 } }
)["results"];
results.forEach(document => {
requests.push({
"updateOne": {
"filter": { "_id": document._id },
"update": {
"$set": {
"name": document.value.name,
"age": Number(document.value.age)
},
"$unset": { "person": " " }
}
}
});
if ( requests.length === 500 ) {
// Execute per 500 operations and re-init
db.coll.bulkWrite(requests);
requests = [];
}}
);
// Clean up queues
if(requests.length > 0) {
db.coll.bulkWrite(requests);
}
MongoDB phiên bản 2.6 hoặc 3.0.
Chúng tôi cần sử dụng API hàng loạt hiện không được dùng nữa .
var bulkOp = db.coll.initializeUnorderedBulkOp();
var count = 0;
results.forEach(function(document) {
bulkOp.find({ "_id": document._id}).updateOne(
{
"$set": {
"name": document.value.name,
"age": Number(document.value.age)
},
"$unset": { "person": " " }
}
);
count++;
if (count === 500 ) {
// Execute per 500 operations and re-init
bulkOp.execute();
bulkOp = db.coll.initializeUnorderedBulkOp();
}
});
// clean up queues
if (count > 0 ) {
bulkOp.execute();
}