测试数据:
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
执行更新语句:
语句一:
db.mydb.update({title:"ABC"}, {$inc:{"comments.$.votes":1}}, 0, 1)
执行报错:Cannot apply the positional operator without a corresponding query field containing an array.
语句二:
db.mydb.update({"comments.by":"joe"}, {$inc:{"comments.$.votes":1}}, 0, 1)
执行结果正常
请问是怎么回事?
Komen di sini ialah tatasusunan (lihat mesej ralat Jika anda ingin mengemas kini, anda perlu melintasi
).Apa yang anda katakan di atas adalah betul, ulasan ialah tatasusunan, tetapi tidak perlu melintasinya. "$" yang digunakan oleh poster adalah penyelesaiannya. Cuma salah guna. Mari kita lihat maksud $.
Dalam dua parameter pertama kemas kini, <syarat pertanyaan> dan <operasi kemas kini>, jika kandungan yang anda tanya dalam <syarat pertanyaan> adalah kandungan dalam tatasusunan, dalam <operasi kemas kini> "$" untuk merujuk kepada elemen yang dipadankan dalam pertanyaan sebelumnya.
Contoh kedua anda ialah menanyakan tatasusunan. Dalam contoh pertama, anda menemui dokumen
title="ABC"
dan syarat pertanyaan di sini tidak mengandungi tatasusunan Malah, anda boleh menulis syarat pertanyaan dalam dua contoh bersama-sama, pertanyaantitle="..."
dan mempunyai Dokumen tempat Joe. meninggalkan mesej, kemudian tambahkan +1 pada undian mesej Joe yang ditemui