MongoDB tidak dapat membuat apa yang Anda minta dengan 1 kueri. Namun Anda dapat membuatnya dalam kueri dua langkah.
Pertama-tama, masukkan nilai baru ke dalam array:
db.Test3.findOneAndUpdate(
{_id: ObjectId("58047d0cd63cf401292fe0ad")},
{$push: {"items": {"date": ISODate("2013-01-27T16:38:16.163+0000")}}},
{returnNewDocument: true},
function (err, result) {
}
);
lalu perbarui "lastDate" hanya jika kurang dari yang terakhir Didorong.
db.Test3.findOneAndUpdate (
{_id: ObjectId("58047d0cd63cf401292fe0ad"), "lastDate":{$lt: ISODate("2013-01-25T16:38:16.163+0000")}},
{$set: {"lastDate": ISODate("2013-01-25T16:38:16.163+0000")}},
{returnNewDocument: true},
function (err, result) {
}
);
parameter kedua "lastDate" diperlukan untuk menghindari kondisi balapan. Dengan cara ini Anda dapat yakin bahwa di dalam "lastDate" pasti ada "tanggal tertinggi yang didorong".
Terkait dengan masalah kedua yang Anda minta, Anda dapat mengikuti strategi serupa. Perbarui {"allAre": false}
hanya jika {"_id":yourID, "items.is":false)}
. Pada dasarnya set "false" hanya jika beberapa anak memiliki nilai 'false'. Jika Anda tidak menemukan dokumen dengan properti ini, jangan perbarui apa pun.
// add a new Child to false
db.Test4.findOneAndUpdate(
{_id: ObjectId("5804813ed63cf401292fe0b0")},
{$push: {"items": {"is": false}}},
{returnNewDocument: true},
function (err, result) {
}
);
// update allAre to false if some child is false
db.Test4.findOneAndUpdate (
{_id: ObjectId("5804813ed63cf401292fe0b0"), "items.is": false},
{$set: {"allAre": false}},
{returnNewDocument: true},
function (err, result) {
}
);