sql >> Database >  >> NoSQL >> MongoDB

MongoDB $gte Aggregation Pipeline Operator

In MongoDB, de $gte aggregatiepijplijnoperator vergelijkt twee waarden en retourneert ofwel true of false , afhankelijk van of de eerste waarde groter is dan of gelijk is aan de tweede waarde.

Voorbeeld

Stel dat we een verzameling hebben met de naam data met de volgende documenten:

{ "_id" : 1, "a" : 250, "b" : 250 }
{ "_id" : 2, "a" : 300, "b" : 250 }
{ "_id" : 3, "a" : 250, "b" : 300 }

We kunnen de $gte . gebruiken operator om de a . te vergelijken en b velden:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $gte: [ "$a", "$b" ] }
          }
     }
   ]
)

Resultaat:

{ "a" : 250, "b" : 250, "result" : true }
{ "a" : 300, "b" : 250, "result" : true }
{ "a" : 250, "b" : 300, "result" : false }

In het eerste document, de a en b velden zijn equivalent, wat resulteert in een retourwaarde van true (omdat a is inderdaad groter dan of gelijk aan b ).

In het tweede document a is groter dan b , wat resulteert in een retourwaarde van true (opnieuw omdat a is inderdaad groter dan of gelijk aan b ).

In het derde document, a is kleiner dan b en daarom de $gte operator retourneert false (omdat a is niet groter dan of gelijk aan b ).

Typen vergelijken

De $gte operator vergelijkt zowel waarde als type met behulp van de gespecificeerde BSON-vergelijkingsvolgorde voor waarden van verschillende typen.

Stel dat onze collectie de volgende documenten bevat:

{ "_id" : 4, "a" : 250, "b" : "250" }
{ "_id" : 5, "a" : 250, "b" : NumberDecimal("250") }
{ "_id" : 6, "a" : NumberDecimal("250"), "b" : NumberDecimal("250.00") }
{ "_id" : 7, "a" : "2022-01-03T23:30:15.100Z", "b" : ISODate("2021-01-03T23:30:15.100Z") }

We kunnen $gte . toepassen naar de a en b velden van die documenten:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 4, 5, 6, 7 ] } } },
     {
       $project:
          {
            a: 1,
            b: 1,
            result: { $gte: [ "$a", "$b" ] }
          }
     }
   ]
).pretty()

Resultaat:

{ "_id" : 4, "a" : 250, "b" : "250", "result" : false }
{ "_id" : 5, "a" : 250, "b" : NumberDecimal("250"), "result" : true }
{
	"_id" : 6,
	"a" : NumberDecimal("250"),
	"b" : NumberDecimal("250.00"),
	"result" : true
}
{
	"_id" : 7,
	"a" : "2022-01-03T23:30:15.100Z",
	"b" : ISODate("2021-01-03T23:30:15.100Z"),
	"result" : false
}

In document 4, zowel a en b een waarde hebben van 250 , maar als je goed kijkt naar b , het is een string (het is omgeven door dubbele aanhalingstekens). In dit geval $gte retourneert false . Als we de $lte . hadden gebruikt operator zou dit true hebben opgeleverd .

Document 5 gebruikt ook een waarde van 250, maar de ene is een dubbele en de andere een decimaal. Hoe dan ook, deze zijn equivalent, en dus $gte retourneert true .

Op dezelfde manier retourneert document 6 true omdat beide waarden equivalent zijn, ook al gebruikt de ene expliciet decimalen en de andere niet.

Document 7 retourneert true omdat, hoewel de datum/tijd-waarde in a is groter dan die in b , gebruiken ze verschillende typen om die datum uit te drukken (a gebruikt een datum/tijd-tekenreeks en b gebruikt een Date-object). Als we de $lte . hadden gebruikt operator zou dit true hebben opgeleverd vanwege de BSON-vergelijkingsvolgorde.

Null-waarden

$gte vergelijkingen kunnen worden gemaakt met null . En het vergelijken van null naar null retourneert true .

Stel dat we de volgende documenten aan onze collectie toevoegen:

{ "_id" : 8, "a" : 250, "b" : null }
{ "_id" : 9, "a" : null, "b" : 250 }
{ "_id" : 10, "a" : null, "b" : null }

Laten we $gte toepassen naar die documenten:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 8, 9, 10 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $gte: [ "$a", "$b" ] }
          }
     }
   ]
)

Resultaat:

{ "a" : 250, "b" : null, "result" : true }
{ "a" : null, "b" : 250, "result" : false }
{ "a" : null, "b" : null, "result" : true }

Ontbrekende velden

Als een van de velden die u probeert te vergelijken ontbreekt, $gte retourneert true als het tweede veld ontbreekt, en false als de eerste ontbreekt.

Stel dat we de volgende documenten aan onze collectie toevoegen:

{ "_id" : 11, "a" : 250 }
{ "_id" : 12, "b" : 250 }

Laten we $gte toepassen naar die documenten:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 11, 12 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $gte: [ "$a", "$b" ] }
          }
     }
   ]
)

Resultaat:

{ "a" : 250, "result" : true }
{ "b" : 250, "result" : false }

Oneindig

Infinity vergelijken tot Infinity retourneert true .

-Infinity vergelijken naar -Infinity retourneert true .

Infinity vergelijken naar -Infinity retourneert true .

-Infinity vergelijken tot Infinity retourneert false .

Stel dat we de volgende documenten aan onze collectie toevoegen:

{ "_id" : 13, "a" : Infinity, "b" : Infinity }
{ "_id" : 14, "a" : -Infinity, "b" : -Infinity }
{ "_id" : 15, "a" : Infinity, "b" : -Infinity }
{ "_id" : 16, "a" : -Infinity, "b" : Infinity }

Laten we $gte toepassen naar die documenten:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 13, 14, 15, 16 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $gte: [ "$a", "$b" ] }
          }
     }
   ]
)

Resultaat:

{ "a" : Infinity, "b" : Infinity, "result" : true }
{ "a" : -Infinity, "b" : -Infinity, "result" : true }
{ "a" : Infinity, "b" : -Infinity, "result" : true }
{ "a" : -Infinity, "b" : Infinity, "result" : false }

  1. MongoDB $currentDate

  2. $groepsresultaat verkrijgen met groepstelling

  3. Webscraping en crawlen met Scrapy en MongoDB

  4. Retourneer resultaten mangoest in zoekopdracht naar een variabele