sql >> Databáze >  >> NoSQL >> MongoDB

Automatické počítání polí v mongodb

MongoDB nemůže udělat to, co požadujete, pomocí 1 dotazu. Můžete to ale udělat ve dvou krocích.

Nejprve vložte novou hodnotu do pole:

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

}
);

pak aktualizujte "lastDate" pouze pokud je menší než poslední 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) {
   }
  ); 

druhý parametr "lastDate" je nutný, aby se zabránilo sporu. Tímto způsobem si můžete být jisti, že uvnitř "lastDate" je s jistotou "nejvyšší datum posunuto".

V souvislosti s druhým problémem, na který se ptáte, můžete postupovat podobnou strategií. Aktualizujte {"allAre": false} pouze pokud {"_id":yourID, "items.is":false)} . V zásadě nastavte "false" pouze v případě, že některý z potomků má hodnotu "false". Pokud jste nenašli dokument s touto vlastností, pak nic neaktualizujte.

// 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. Seznam MongoDB Filtr sbírek

  2. Jak vytvořit MongoDB MultiKey index na atributu položek v poli .NET Driver

  3. console.log nezobrazuje očekávané vlastnosti objektu

  4. Vyberte vnořená pole v mongo db