MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cập nhật tài liệu bằng cách sử dụng kết quả của các trường được nối

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)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. C # Mongo DeleteMany - mà không cần sử dụng một lớp

  2. Có chạy mongoskin chỉ với mongodb phiên bản 1.4 trở lên không?

  3. MongoDB:đâu là giới hạn giữa ít và nhiều?

  4. Mongoose:không thể truy cập giá trị đã nhập

  5. Liệt kê các thuộc tính động trong Mô hình Mongoid