MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Calcul automatique des champs dans mongodb

MongoDB ne peut pas faire ce que vous demandez avec 1 requête. Mais vous pouvez le faire en deux étapes.

Tout d'abord, poussez la nouvelle valeur dans le tableau :

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

}
);

puis mettez à jour "lastDate" uniquement s'il est inférieur au dernier Push.

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

le deuxième paramètre "lastDate" est nécessaire pour éviter les conditions de concurrence. De cette façon, vous pouvez être sûr qu'à l'intérieur de "lastDate" il y a à coup sûr la "date la plus élevée poussée".

En ce qui concerne le deuxième problème que vous posez, vous pouvez suivre une stratégie similaire. Mettre à jour {"allAre": false} uniquement si {"_id":yourID, "items.is":false)} . Fondamentalement, définissez "false" uniquement si un enfant de a une valeur "false". Si vous ne trouvez pas de document avec cette propriété, ne mettez rien à jour.

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