sql >> Databasteknik >  >> NoSQL >> MongoDB

Automatisk beräkning av fält i mongodb

MongoDB kan inte göra det du efterfrågar med en fråga. Men du kan göra det i tvåstegsfråga.

Först av allt, tryck in det nya värdet i arrayen:

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

}
);

uppdatera sedan "lastDate" endast om det är mindre än det senaste 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 andra parametern "lastDate" behövs för att undvika rastillstånd. På så sätt kan du vara säker på att inuti "lastDate" finns det säkert det "högsta datumet pushed".

Relaterat till det andra problemet du frågar efter kan du följa en liknande strategi. Uppdatera {"allAre": false} endast om {"_id":yourID, "items.is":false)} . Ange i princip "false" endast om något barn av har värdet "false". Om du inte hittar ett dokument med den här egenskapen ska du inte uppdatera något.

// 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. Hur man returnerar underdokument från ett objekt i en array med Meteor och MongoDB

  2. Hur implementerar jag denna mongodb-fråga och uppdateringsoperation (CSharp-drivrutin)?

  3. Redis-nycklar visas inte när du använder Cache-fasad i Laravel

  4. Hur man får DIFF på sorterat set