sql >> Database teknologi >  >> NoSQL >> MongoDB

Automatisk beregning af felter i mongodb

MongoDB kan ikke lave det, du beder om, med 1 forespørgsel. Men du kan lave det i to-trins forespørgsel.

Først og fremmest skal du skubbe den nye værdi ind i arrayet:

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

}
);

opdater derefter kun "lastDate", hvis er mindre end den sidste 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) {
   }
  ); 

den anden parameter "lastDate" er nødvendig for at undgå race tilstand. På denne måde kan du være sikker på, at der inde i "lastDate" helt sikkert er den "højeste dato pushed".

I forbindelse med det andet problem, du beder om, kan du følge en lignende strategi. Opdater {"allAre": false} kun hvis {"_id":yourID, "items.is":false)} . Sæt som udgangspunkt kun "false", hvis et barn af har en værdi "falsk". Hvis du ikke kan finde et dokument med denne egenskab, skal du ikke opdatere noget.

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



  1. Hvordan laver man en forespørgselsdato i mongodb ved hjælp af pymongo?

  2. Sådan tælles elementer på listen over lister

  3. Mongodb kan ikke starte i Ubuntu 15.04

  4. In-memory cache med LRU-udløb