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

pushOrModify seperti operator untuk subdocument mongo

Ini sebenarnya membutuhkan pernyataan pembaruan "dua" (atau "tiga" dengan upsert ) dan merupakan salah satu alasan yang sangat baik mengapa operasi "Massal" ada.

db.collection.bulkWrite([
  // Attempt to update the matched element
  { "updateOne": {
    "filter": { 
      "name": "SweetTown",
      "residents.name": "Bob"
    },
    "update": {
      "$set": { "residents.$.reputation": 30 }    
    }
  },
  // $push the element where not matched
  { "updateOne": {
    "filter": {
      "name": "SweetTown",
      "residents.name": { "$ne": "Bob" } 
    },
    "update": { 
      "$push": { 
        "residents": { "name": "Bob", "reputation": 30 } 
      }
    } 
  }}
])

Atau jika Anda benar-benar ingin memasukkan "upsert" untuk dokumen dasar "SweetTown" maka Anda perlu memisahkan kekhawatiran itu ke dalam pengujiannya sendiri:

db.collection.bulkWrite([
  // Attempt to update the matched element
  { "updateOne": {
    "filter": { 
      "name": "SweetTown",
      "residents.name": "Bob"
    },
    "update": {
      "$set": { "residents.$.reputation": 30 }    
    }
  },
  // $push the element where not matched
  { "updateOne": {
    "filter": {
      "name": "SweetTown",
      "residents.name": { "$ne": "Bob" } 
    },
    "update": { 
      "$push": { 
        "residents": { "name": "Bob", "reputation": 30 } 
      }
    } 
  }},
  // Only use $setOnInsert when actually an upsert
  { "updateOne": {
      "filter": {
        "name": "SweetTown"
      },
      "update": {
        "$setOnInsert": {
           "residents": [{ "name": "Bob", "reputation": 30 }]
        }
      },
      "upsert": true
  }}
])

Jadi konsep umum yang ada adalah hanya terapkan $setOnInsert tindakan saat "upsert" benar-benar terjadi. Untuk memastikan ini hanya terjadi dalam kasus ini, operasi lain yang benar-benar melihat elemen array tidak ditandai dengan "upsert" pilihan. Bagian itu sengaja.

Apa pun cara Anda melihatnya, itu hanya mungkin untuk satu operasi tersebut untuk benar-benar membuat modifikasi apa pun dalam database, baik sebagai elemen ditemukan atau tidak, atau bahkan dokumen tidak ditemukan dan yang baru dibuat.

Dalam kasus apa pun tidak mungkin melakukan operasi semacam itu dalam satu pernyataan pembaruan. Namun karena operasi "Massal" sebenarnya hanya satu permintaan dengan satu tanggapan, maka sejauh menyangkut aplikasi Anda maka hanya perlu berbicara dengan server sekali agar server mencoba ketiga hal ini dan memberikan tanggapan.

Untuk penggunaan sebelumnya dari API Massal langsung, maka sintaks alternatifnya adalah:

var bulk = db.collection.initializeOrderedBulkOp();

// $set matched where existing
bulk.find({ "name": "SweetTown", "residents.name": "Bob" }).updateOne({
  "$set": { "residents.$.reputation": 30 }
});

// $push where not existing
bulk.find({ "name": "SweetTown", "residents.name": { "$ne": "Bob" } }).updateOne({
  "$push": { "residents": { "name": "Bob", "reputation": 30 } }
});

// Attempt to upsert only
bulk.find({ "name": "SweetTown" }).upsert().updateOne({
  "$setOnInsert": {
    "residents": [{ "name": "Bob", "reputation": 30 }]
  }
})

bulk.execute();



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. pymongo:MongoClient atau Koneksi

  2. symfony2 pilihan bentuk dan mongodb

  3. Saya mendapatkan kesalahan saat menggunakan aplikasi Node.Js dengan mongoDB di Elastic Beanstalk

  4. Node, Mongoose:Hapus elemen json dari hasil kueri dengan delete

  5. Bagaimana cara mengurutkan koleksi berdasarkan nilai dalam array?