sql >> Base de Datos >  >> NoSQL >> MongoDB

Cálculo automático de campos en mongodb

MongoDB no puede hacer lo que está pidiendo con 1 consulta. Pero puede hacerlo en una consulta de dos pasos.

En primer lugar, inserte el nuevo valor en la matriz:

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

}
);

luego actualice "lastDate" solo si es menor que el último 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) {
   }
  ); 

se necesita el segundo parámetro "lastDate" para evitar la condición de carrera. De esta manera, puede estar seguro de que dentro de "lastDate" se encuentra con seguridad la "fecha más alta enviada".

En relación con el segundo problema que está preguntando, puede seguir una estrategia similar. Actualizar {"allAre": false} solo si {"_id":yourID, "items.is":false)} . Básicamente, establezca "falso" solo si algún hijo tiene un valor "falso". Si no encuentra un documento con esta propiedad, no actualice nada.

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