MongoDB không thể thực hiện những gì bạn đang yêu cầu với 1 truy vấn, nhưng bạn có thể thực hiện nó trong truy vấn hai bước.
Trước hết, hãy đẩy giá trị mới vào mảng:
db.Test3.findOneAndUpdate(
{_id: ObjectId("58047d0cd63cf401292fe0ad")},
{$push: {"items": {"date": ISODate("2013-01-27T16:38:16.163+0000")}}},
{returnNewDocument: true},
function (err, result) {
}
);
sau đó cập nhật "lastDate" chỉ khi nhỏ hơn ngày cuối cùng được đẩy.
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) {
}
);
tham số thứ hai "lastDate" là cần thiết để tránh tình trạng chủng tộc. Bằng cách này, bạn có thể chắc chắn rằng bên trong "Ngày cuối cùng" chắc chắn có "ngày cao nhất được đẩy".
Liên quan đến vấn đề thứ hai bạn đang yêu cầu, bạn có thể làm theo một chiến lược tương tự. Cập nhật {"allAre": false}
chỉ khi {"_id":yourID, "items.is":false)}
. Về cơ bản chỉ đặt "false" nếu một số con của có giá trị 'false'. Nếu bạn không tìm thấy tài liệu có thuộc tính này thì đừng cập nhật gì cả.
// 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) {
}
);