Cách tốt nhất để làm điều này là trong phiên bản 4.2 trở lên cho phép sử dụng đường ống kết hợp trong tài liệu cập nhật và updateOne, updateManyhoặc updatephương pháp thu thập. Lưu ý rằng phần sau đã bị phản đối trong hầu hết các trình điều khiển ngôn ngữ.
MongoDB 4.2+
Phiên bản 4.2 cũng giới thiệu $settoán tử giai đoạn đường ống là bí danh cho $addFields. Tôi sẽ sử dụng $setở đây vì nó ánh xạ với những gì chúng ta đang cố gắng đạt được.
db.collection.<update method>(
{},
[
{"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
]
)
MongoDB 3,4+
Trong 3,4+ bạn có thể sử dụng $addFieldsvà các $outtoán tử đường ống tổng hợp.
db.collection.aggregate(
[
{ "$addFields": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}},
{ "$out": "collection" }
]
)
Lưu ý rằng điều này không cập nhật bộ sưu tập của bạn mà thay vào đó thay thế bộ sưu tập hiện có hoặc tạo bộ sưu tập mới. Ngoài ra, đối với các hoạt động cập nhật yêu cầu "nhập kiểu", bạn sẽ cần xử lý phía máy khách và tùy thuộc vào thao tác, bạn có thể cần sử dụng find()phương thức thay vì .aggreate()phương thức.
MongoDB 3.2 và 3.0
Cách chúng tôi làm điều này là bằng cách nhập $projecttài liệu của chúng tôi và sử dụng $concattoán tử tổng hợp chuỗi để trả về chuỗi được nối. Chúng tôi Từ đó, sau đó bạn lặp lại con trỏ và sử dụng $settoán tử cập nhật để thêm trường mới vào tài liệu của bạn bằng các thao tác hàng loạt để đạt hiệu quả tối đa.
Truy vấn tổng hợp:
var cursor = db.collection.aggregate([
{ "$project": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}}
])
MongoDB 3.2 trở lên
Từ đây, bạn cần sử dụng bulkWritephương pháp.
var requests = [];
cursor.forEach(document => {
requests.push( {
'updateOne': {
'filter': { '_id': document._id },
'update': { '$set': { 'name': document.name } }
}
});
if (requests.length === 500) {
//Execute per 500 operations and re-init
db.collection.bulkWrite(requests);
requests = [];
}
});
if(requests.length > 0) {
db.collection.bulkWrite(requests);
}
MongoDB 2.6 và 3.0
Từ phiên bản này, bạn cần sử dụng BulkAPI hiện không dùng nữa và các phương thức liên quan .
var bulk = db.collection.initializeUnorderedBulkOp();
var count = 0;
cursor.snapshot().forEach(function(document) {
bulk.find({ '_id': document._id }).updateOne( {
'$set': { 'name': document.name }
});
count++;
if(count%500 === 0) {
// Excecute per 500 operations and re-init
bulk.execute();
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// clean up queues
if(count > 0) {
bulk.execute();
}
MongoDB 2.4
cursor["result"].forEach(function(document) {
db.collection.update(
{ "_id": document._id },
{ "$set": { "name": document.name } }
);
})