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

Cập nhật trường MongoDB bằng cách sử dụng giá trị của trường khác

Cách tốt nhất để làm điều này là trong phiên bản 4.2+, cho phép sử dụng đường dẫn tổng hợp trong cập nhật tài liệu và updateOne , updateMany hoặc update các phương pháp thu thập. Lưu ý rằng cái sau đã không được dùng nữa ở hầu hết nếu không phải tất cả 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ó bản đồ với những gì chúng tôi đang cố gắng đạt được.

db.collection.<update method>(
    {},
    [
        {"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
    ]
)

Lưu ý rằng dấu ngoặc vuông trong đối số thứ hai cho phương thức xác định một đường dẫn tổng hợp thay vì một tài liệu cập nhật thuần túy. Sử dụng tài liệu thuần túy sẽ không hoạt động chính xác.

MongoDB 3.4+

Trong 3,4+, bạn có thể sử dụng $addFields$out các nhà khai thác đườ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 thế bộ sưu tập hiện có hoặc tạo một 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 máy", 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() thay vì .aggreate() phương pháp.

MongoDB 3.2 và 3.0

Cách chúng tôi thực hiện việc này là bằng $project nhập 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. Từ đó, bạn lặp lại con trỏ và sử dụng $set cập nhật toán tử để thêm trường mới vào tài liệu của bạn bằng cách sử dụng hoạt động 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 hoặc mới hơ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 hiện không được dùng nữa API và các phương thức liên quan của nó.

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 } }
    );
})


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB có vấn đề kết nối lại hay tôi làm sai?

  2. Làm cách nào để sử dụng một biến làm tên trường trong mongodb-native findOne ()?

  3. Nhà điều hành đường ống tổng hợp MongoDB $ eq

  4. mongod --bind_ip bằng cách sử dụng docker-compo phiên bản 2

  5. Hệ thống tệp chỉ đọc khi thử mkdir / data / db trên Mac