Pembaruan Mongodb dengan upsert dan multi sintaksis

Saya baru mengenal mongodb dan sangat stres karena dokumentasi mongodb yang tidak lengkap membuat saya harus coba-coba... sayangnya, semua upaya saya tidak berhasil tanpa kesalahan, membuat saya bingung tentang apa yang terjadi dan apa yang harus di-debug...

Saya hanya perlu memperbarui beberapa catatan di database yang cocok dengan kriteria tertentu, dan untuk catatan yang tidak ada, membuat entri baru untuk itu. Saya yakin saya bisa melakukannya dengan akses database tunggal dengan update, upsert dan multi. Inilah yang saya hasilkan:

dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { options: { upsert: true, multi: true } } );

Saya juga sudah mencoba beberapa kombinasi atau bahkan versi lama seperti:

dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { upsert: true }, { multi: true } );

tidak ada satupun yang berhasil...

Tolong bantu saya dengan hal-hal sepele ini... Saya dapat dengan mudah melakukannya di sql, tetapi hal nosql sangat membatasi saya.. Terima kasih!

Sunting:

Permintaan yang sama pada find berfungsi dengan baik:

dbschema.Person.find( { person_id: { $in: ["734533604" ,"701084015"] } }, function ( err, results ) {
    console.log( 'result: ' + results );
    console.log( 'error: ' + err );
    console.log( 'result length: ' + results.length );
} );

Sunting:

Saya mengharapkan catatan "tidak ditemukan" dibuat, dan catatan yang ditemukan diperbarui. logika saya mungkin salah dan saya sangat bingung sekarang.

Awalnya, saya mencari () satu catatan pada satu waktu, mengubah nilainya, dan memanggil save () untuk setiap catatan yang diubah, tetapi ketika saya menerapkannya secara langsung, waktu respons menjadi ratusan kali lebih lambat terutama ketika ada beberapa ratus catatan untuk diperbarui pada setiap permintaan.

Kemudian saya menemukan find() + $in, dan kinerjanya dipulihkan dan bahkan lebih baik dari sebelumnya (saat kueri), tetapi pembaruan masih sangat lambat.. Oleh karena itu, sekarang saya mencari cara untuk memperbarui semua dokumen dalam satu permintaan. .

apa yang biasanya saya lakukan di SQL adalah menggunakan UPDATE WHEN CASE THEN... misalnya:

UPDATE person SET score = CASE
WHEN person_id = "734533604" THEN 1200
WHEN person_id = "701084015" THEN 1200
ELSE
score
END

person Zennichimaro    schedule 01.05.2013    source sumber
comment
tidak mungkin menggunakan upsert dengan $in karena upsert dapat memasukkan satu personid pada satu waktu dan akan membingungkan antara nilai pertama dan kedua   -  person Ajay Beniwal    schedule 01.05.2013
comment
Anda memiliki beberapa masalah, beberapa masalah sintaksis tetapi yang lain desain. Jika Anda mencari 2 catatan yang cocok dan tidak ada yang ditemukan, apakah Anda mengharapkan keduanya dibuat? Jika salah satu dari dua ditemukan, apakah Anda mengharapkan satu diperbarui dan satu lagi dibuat? Upsert dapat membuat paling banyak satu rekaman baru dan inilah mengapa multi dan upsert terkadang tidak masuk akal jika digabungkan.   -  person Asya Kamsky    schedule 02.05.2013
comment
ya saya mengharapkan keduanya dibuat, jika tidak ditemukan, jika ditemukan, diperbarui, dan yang tidak ditemukan dibuat.. Benar, saya banyak bingung dan mungkin logika saya salah juga ..tapi saya akan menjelaskan mengapa saya mencoba melakukan cara ini..   -  person Zennichimaro    schedule 02.05.2013


Jawaban (1)


Anda tidak dapat memperbarui beberapa catatan berdasarkan kriteria yang berbeda dan mengharapkan "upsert" untuk memahami maksud Anda. Bendera upsert dapat menyebabkan penyisipan paling banyak satu dokumen dan jika Anda memeriksa dokumentasinya, Anda akan melihat bahwa tidak masuk akal untuk memiliki kriteria "gabungan" untuk pembaruan jika terjadi upsert.

Dalam contoh Anda, manakah dari dua nilai fbid yang harus digunakan sisipan?

Saya rasa dalam kasus Anda, Anda dapat mengambil beberapa pendekatan (semuanya melibatkan lebih dari satu operasi). Anda dapat memperbarui menggunakan flag upsert dalam loop yang memanggil update satu kali untuk setiap nilai fbid - ini akan berfungsi seperti yang Anda harapkan dan jika fbid tidak ditemukan, dokumen baru untuk itu akan dibuat. Cara lain melibatkan kueri sebelum menjalankan pembaruan, tetapi menurut saya cara tersebut mungkin lebih rentan terhadap kondisi balapan.

Berikut penjelasan cara kerja pembaruan - menurut saya cukup lengkap: http://docs.mongodb.org/manual/core/update/#update-operations-with-the-upsert-flag

person Asya Kamsky    schedule 01.05.2013
comment
Terima kasih, saya mengharapkan semua catatan di $in diperbarui atau disisipkan. Saya tidak yakin apakah ini cara untuk melakukannya karena saya mencoba mengoptimalkan banyak penyisipan/pembaruan yang menghabiskan waktu respons saya. Apakah Anda tahu bagaimana saya bisa menyisipkan/memperbarui banyak catatan dan sebaiknya menyimpannya dalam satu kesempatan? - person Zennichimaro; 02.05.2013
comment
tidak ada cara untuk melakukan itu, jika saya memahami pertanyaan Anda. - person Asya Kamsky; 02.05.2013
comment
Tautan hilang 404. - person luckydonald; 15.10.2018
comment
Terima kasih. Sekarang sudah diperbaiki. - person Asya Kamsky; 17.10.2018