Untuk menyisipkan dokumen jika tidak ada dilakukan dengan cara upsert dan jika Anda ingin memperbarui dokumen yang disematkan bersyarat Anda memerlukan operator $ positional. Jadi, Anda perlu menggunakan keduanya dalam kueri untuk mengimplementasikan fungsi di atas.
Tetapi saat ini mongodb tidak mendukung pemasangan dengan $ operator posisional
Jadi yang Anda inginkan saat ini tidak mungkin dilakukan dalam satu kueri, atau Anda dapat melakukannya dalam dua kueri.
Pertama
db.collection('ratings').update(
{"refid":refid, "votes.ip": ip},
{
$set: { "votes.$.rating":rating }
}
)
Ini mengembalikan jumlah dokumen yang diperbarui, jika 1 tidak apa-apa, dan jika 0 Anda perlu mendorong rekor baru.
db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
{$push: { votes: { "ip":ip , "rating":rating }}
})
Ada juga tiket jira untuk operator posisi dan upserting, silakan pilih masalah ini jika Anda menginginkan fungsi ini di mongodb. Di bawah ini adalah tautan masalah
https://jira.mongodb.org/browse/SERVER-3326
(EDIT :Tiket jira ditutup dengan Won't Do pada bulan Juni 2019)