MongoDB वह नहीं बना सकता जो आप 1 प्रश्न के साथ पूछ रहे हैं। लेकिन आप इसे दो-चरणीय क्वेरी में बना सकते हैं।
सबसे पहले, नए मान को ऐरे में पुश करें:
db.Test3.findOneAndUpdate(
{_id: ObjectId("58047d0cd63cf401292fe0ad")},
{$push: {"items": {"date": ISODate("2013-01-27T16:38:16.163+0000")}}},
{returnNewDocument: true},
function (err, result) {
}
);
फिर "lastDate" को तभी अपडेट करें जब आखिरी पुश से कम हो।
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) {
}
);
दौड़ की स्थिति से बचने के लिए दूसरा पैरामीटर "lastDate" आवश्यक है। इस तरह आप सुनिश्चित हो सकते हैं कि "lastDate" के अंदर निश्चित रूप से "उच्चतम तिथि पुश" है।
आप जिस दूसरी समस्या के लिए पूछ रहे हैं उससे संबंधित एक समान रणनीति का पालन कर सकते हैं। अपडेट करें {"allAre": false}
केवल अगर {"_id":yourID, "items.is":false)}
. मूल रूप से केवल "झूठा" सेट करें यदि कुछ बच्चे का मान 'झूठा' है। अगर आपको इस संपत्ति के साथ कोई दस्तावेज़ नहीं मिला तो कुछ भी अपडेट न करें।
// 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) {
}
);