MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Automatische Berechnung von Feldern in Mongodb

MongoDB kann das, wonach Sie fragen, nicht mit einer Abfrage erstellen. Sie können dies jedoch in einer Abfrage in zwei Schritten tun.

Schieben Sie zuerst den neuen Wert in das Array:

db.Test3.findOneAndUpdate(
{_id: ObjectId("58047d0cd63cf401292fe0ad")},
{$push: {"items":  {"date": ISODate("2013-01-27T16:38:16.163+0000")}}},
{returnNewDocument: true},
function (err, result) {

}
);

dann aktualisiere "lastDate" nur, wenn es kleiner ist als das letzte 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) {
   }
  ); 

der zweite Parameter "lastDate" wird benötigt, um Race Condition zu vermeiden. Auf diese Weise können Sie sicher sein, dass in "lastDate" sicher das "höchste Datum gepusht" ist.

In Bezug auf das zweite Problem, nach dem Sie fragen, können Sie eine ähnliche Strategie verfolgen. Aktualisieren Sie {"allAre": false} nur wenn {"_id":yourID, "items.is":false)} . Setzen Sie grundsätzlich nur dann "false", wenn ein Kind von einen Wert "false" hat. Wenn Sie kein Dokument mit dieser Eigenschaft finden, aktualisieren Sie nichts.

// 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) {
   }
  );