MongoDB kan inte göra det du efterfrågar med en fråga. Men du kan göra det i tvåstegsfråga.
Först av allt, tryck in det nya värdet i arrayen:
db.Test3.findOneAndUpdate(
{_id: ObjectId("58047d0cd63cf401292fe0ad")},
{$push: {"items": {"date": ISODate("2013-01-27T16:38:16.163+0000")}}},
{returnNewDocument: true},
function (err, result) {
}
);
uppdatera sedan "lastDate" endast om det är mindre än det senaste pushed.
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) {
}
);
den andra parametern "lastDate" behövs för att undvika rastillstånd. På så sätt kan du vara säker på att inuti "lastDate" finns det säkert det "högsta datumet pushed".
Relaterat till det andra problemet du frågar efter kan du följa en liknande strategi. Uppdatera {"allAre": false}
endast om {"_id":yourID, "items.is":false)}
. Ange i princip "false" endast om något barn av har värdet "false". Om du inte hittar ett dokument med den här egenskapen ska du inte uppdatera något.
// 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) {
}
);