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

Bagaimana cara mendapatkan kembali nilai baru setelah pembaruan dalam array yang disematkan?

Jika Anda menggunakan MongoDB 3.0 atau yang lebih baru, Anda perlu menggunakan .findOneAndUpdate() dan gunakan projection opsi untuk menentukan subset bidang yang akan dikembalikan. Anda juga perlu mengatur returnNewDocument untuk true . Tentu saja Anda perlu menggunakan $elemMatch operator proyeksi di sini karena Anda tidak dapat menggunakan proyeksi posisi dan mengembalikan dokumen baru.

Seperti yang ditunjukkan seseorang:

Anda harus menggunakan .findOneAndUpdate() karena .findAndModify() disorot sebagai usang di setiap driver bahasa resmi. Hal lainnya adalah sintaks dan opsi cukup konsisten di seluruh driver untuk .findOneAndUpdate() . Dengan .findAndModify() , sebagian besar driver tidak menggunakan objek tunggal yang sama dengan kunci "query/update/fields". Jadi sedikit kurang membingungkan ketika seseorang menerapkan bahasa lain untuk menjadi konsisten. Perubahan API standar untuk .findOneAndUpdate() sebenarnya sesuai dengan rilis server 3.x daripada 3.2.x. Perbedaan lengkapnya adalah bahwa metode shell sebenarnya tertinggal di belakang driver lain ( untuk sekali ! ) dalam mengimplementasikan metode tersebut. Jadi sebagian besar driver benar-benar mengalami lonjakan rilis besar terkait dengan rilis 3.x dengan perubahan tersebut.

db.collection.findOneAndUpdate( 
    { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
         "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },  
    { $inc : { "rankings.$.score" : 1 } },  
    { 
        "projection": { 
            "rankings": { 
                "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") } 
            }
        }, 
        "returnNewDocument": true 
    }
)

Dari MongoDB 3.0 dan seterusnya, Anda perlu menggunakan findAndModify dan fields opsi juga Anda perlu mengatur new untuk true di lain untuk mengembalikan nilai baru.

db.collection.findAndModify({   
    query: { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
        "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },     
    update: { $inc : { "rankings.$.score" : 1 } },       
    new: true,  
    fields: { 
        "rankings": { 
            "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
        }  
    }
})

Kedua kueri menghasilkan:

{
        "_id" : ObjectId("56d6a7292c06e85687f44541"),
        "rankings" : [
                {
                        "_id" : ObjectId("46d6a7292c06e85687f55543"),
                        "name" : "Ranking 2",
                        "score" : 11
                }
        ]
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bantuan formulir Rails + MongoMapper + EmbeddedDocument

  2. MongoDB $mul

  3. Dukungan untuk beberapa tipe pengguna dengan Passport-local luwak node.js

  4. Hubungan indeks/RAM MongoDB

  5. Mengapa arah indeks penting di MongoDB?