sql >> Database >  >> NoSQL >> MongoDB

Automatisch velden berekenen in mongodb

MongoDB kan niet maken waar je om vraagt ​​met 1 zoekopdracht. Maar je kunt het in twee stappen doen.

Duw eerst de nieuwe waarde in de array:

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

}
);

update dan "lastDate" alleen als deze minder is dan de laatst gepushte.

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

de tweede parameter "lastDate" is nodig om racecondities te voorkomen. Op deze manier kunt u er zeker van zijn dat er binnen "lastDate" zeker de "hoogste datum gepusht" is.

Met betrekking tot het tweede probleem waar u om vraagt, kunt u een vergelijkbare strategie volgen. Update {"allAre": false} alleen als {"_id":yourID, "items.is":false)} . Stel in principe alleen "false" in als een kind van een waarde 'false' heeft. Als u geen document met deze eigenschap hebt gevonden, werk dan niets bij.

// 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. MongoDb-verzamelingsnaam configureren voor een klasse in Spring Data

  2. Hoe een verzameling te coderen met regex en complexe criteria met behulp van het Java MongoDB-stuurprogramma?

  3. hoe een hex-tekenreeks naar ObjectId in Python te converteren?

  4. Serieel herhalen over een mongodb-cursor (wachten op callbacks voordat u naar het volgende document gaat)