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

MongoDB $ max

MongoDB má $max operátor, který umožňuje aktualizovat hodnotu pole pouze v případě, že je zadaná hodnota větší než aktuální hodnota pole.

Jinými slovy, pokud $max hodnota je větší než aktuální hodnota v dokumentu, $max je použita hodnota. Jinak zůstane hodnota dokumentu nezměněna.

Příklad

Předpokládejme, že máme sbírku jako je tato:

{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 }
{ "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 }
{ "_id" : 3, "exercise" : "squat", "bestLift" : 210 }

A představte si, že po každém tréninku aktualizujeme kolekci nejnovějšími cviky. V tomto případě bychom chtěli pouze bestLift pole, které bude aktualizováno, pokud byl náš poslední výtah těžší než náš předchozí nejlepší výtah (tj. aktuální hmotnost uvedená pro příslušný výtah).

V tomto případě bychom mohli použít $max operátora k dosažení tohoto výsledku.

Příklad:

db.workout.update( 
  { _id: 1 }, 
  { $max: { bestLift: 240 } } 
)

Výstup:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Tato zpráva nám říká, že jeden dokument se shodoval a byl aktualizován.

Podívejme se znovu na sbírku.

db.workout.find()

Výsledek:

{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 }
{ "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 }
{ "_id" : 3, "exercise" : "squat", "bestLift" : 210 }

Vidíme, že bestLift pole pro první dokument bylo aktualizováno novou hodnotou. Je to proto, že 240 je vyšší než jeho předchozí hodnota 230.

Když je hodnota nižší

Když je hodnota zadaná pomocí $max je nižší než stávající hodnota v dokumentu, nic se neaktualizuje.

Příklad:

db.workout.update( 
  { _id: 1 }, 
  { $max: { bestLift: 220 } } 
)

Výstup:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

Podle zprávy vidíme, že nebylo nic aktualizováno.

Podívejme se znovu na sbírku.

db.workout.find()

Výsledek:

{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 }
{ "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 }
{ "_id" : 3, "exercise" : "squat", "bestLift" : 210 }

Vidíme, že hodnota zůstává na 240, i když jsme se ji pokusili aktualizovat na 220. To se očekává, protože jsme použili $max .

Data

Můžete použít $max v datech.

Předpokládejme, že máme collection volal předplatné s následujícím dokumentem:

{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") } 

Zkusme aktualizovat datum datem, které je dřívější než aktuální datum v dokumentu.

db.subscriptions.update( 
  { _id: 1 }, 
  { $max: { expiry: new Date("2020-01-01") } } 
)

Zde se snažíme aktualizovat rok z 2021 do 2020 . Vzhledem k tomu, že nové datum je dřívější než stávající, dostáváme následující.

db.subscriptions.find()

Výsledek:

{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }

Podle očekávání nebylo nic aktualizováno.

Zkusme to aktualizovat na pozdější datum.

db.subscriptions.update( 
  { _id: 1 }, 
  { $max: { expiry: new Date("2022-01-01") } } 
)

Výstup:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Podle zprávy vidíme, že dokument byl aktualizován.

Zkontrolujeme.

db.subscriptions.find()

Výsledek:

{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }

Datum bylo aktualizováno podle očekávání.


  1. Mongo převede všechna číselná pole, která jsou uložena jako řetězec

  2. Dotaz $pull vnořeného pole pomocí ovladače C# MongoDB

  3. Celer umožňuje resetování připojení peerem

  4. MongoDB updateMany()