MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Perbarui dokumen menggunakan hasil bidang gabungan

Anda perlu menggunakan .aggregate() metode yang menyediakan akses ke pipeline agregasi.

Di $project Anda tahap Anda perlu menggunakan $concat operator untuk menggabungkan bidang Anda.

Anda kemudian dapat menggunakan hasil agregasi untuk memperbarui koleksi Anda menggunakan "massal" operasi untuk efisiensi

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

Setelah operasi ini, dokumen Anda akan terlihat seperti ini:

{
        "_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")
}

Itu bukan akhir dari cerita karena "Bulk" API dan metode terkaitnya tidak digunakan lagi dalam rilis yang akan datang (versi 3.2 ) sehingga dari versi itu kita perlu menggunakan db.collection.bulkWrite() metode.

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. Batas tidak. baris dalam input mongodb

  2. Indeks Mongodb 2dsphere untuk bidang array bersarang

  3. Kueri agregat di mongo berfungsi, tidak di Pymongo

  4. Bagaimana cara menghapus cascade menggunakan Mongoose remove middleware?

  5. subdokumen MongoDB elemMatch