Bạn cần sử dụng .aggregate()
phương pháp cung cấp quyền truy cập vào các đường ống tổng hợp.
Trong $project
của bạn
giai đoạn bạn cần sử dụng $concat
toán tử để nối trường của bạn.
Sau đó, bạn có thể sử dụng kết quả tổng hợp để cập nhật bộ sưu tập của mình bằng cách sử dụng "số lượng lớn" hoạt động hiệu quả
var bulk = db.events.initializeOrderedBulkOp();
var count = 0;
db.events.aggregate([
{ "$project": {
"iso_start": { "$concat": [ "$date", " ", "$time" ] },
"iso_end": { "$concat": [ "$date", " ", "$endtime" ] }
}}
]).forEach(function(doc) {
bulk.find({'_id': doc._id}).updateOne({
"$set": {
"iso_start": new Date(doc.iso_start),
"iso_end": new Date(doc.iso_end)
}
});
count++;
if(count % 200 === 0) {
// update per 200 operations and re-init
bulk.execute();
bulk = db.events.initializeOrderedBulkOp();
}
})
// Clean up queues
if(count > 0) bulk.execute();
Sau thao tác này, tài liệu của bạn trông giống như sau:
{
"_id" : "aaaaaaaaaaaa",
"title" : "Hello, World!",
"date" : "Thursday, November 12, 2015",
"time" : "9:30 AM",
"endtime" : "11:30 AM",
"iso_start" : ISODate("2015-11-12T06:30:00Z"),
"iso_end" : ISODate("2015-11-12T08:30:00Z")
}
{
"_id" : "bbbbbbbbbbbb",
"title" : "To B or not to B",
"date" : "Thursday, November 12, 2015",
"time" : "10:30 AM",
"endtime" : "11:00 AM",
"iso_start" : ISODate("2015-11-12T07:30:00Z"),
"iso_end" : ISODate("2015-11-12T08:00:00Z")
}
Đó không phải là kết thúc của câu chuyện vì "Bulk" API và các phương thức liên quan của nó không được dùng nữa trong bản phát hành sắp tới (phiên bản 3.2), do đó từ phiên bản đó, chúng tôi sẽ cần sử dụng db.collection.bulkWrite()
phương pháp.
var operations = [];
db.events.aggregate([
{ "$project": {
"iso_start": { "$concat": [ "$date", " ", "$time" ] },
"iso_end": { "$concat": [ "$date", " ", "$endtime" ] }
}}
]).forEach(function(doc) {
var operation = {
updateOne: {
filter: { "_id": doc._id },
update: {
"$set": {
"iso_start": new Date(doc.iso_start),
"iso_end": new Date(doc.iso_end)
}
}
}
};
operations.push(operation);
})
operations.push({ ordered: true, writeConcern: { w: "majority", wtimeout: 5000 } });
db.events.bulkWrite(operations)