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
, updateMany
hoặc update
phươ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 $set
toá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 $addFields
và các $out
toá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 $project
tài liệu của chúng tôi và sử dụng $concat
toá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 $set
toá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 bulkWrite
phươ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 Bulk
API 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 } }
);
})