V MongoDB, $cmp
operátor agregačního kanálu porovná dvě hodnoty a vrátí buď -1
, 1
, nebo 0
v závislosti na tom, zda je první hodnota menší, větší nebo rovna první hodnotě.
Konkrétně $cmp
operátor vrátí:
-1
pokud je první hodnota menší než druhá.1
pokud je první hodnota větší než druhá.0
pokud jsou tyto dvě hodnoty ekvivalentní.
Příklad
Předpokládejme, že máme kolekci nazvanou data
s následujícími dokumenty:
{ "_id" : 1, "a" : 2, "b" : 2 } { "_id" : 2, "a" : 2, "b" : 3 } { "_id" : 3, "a" : 3, "b" : 2 }
Můžeme použít $cmp
operátor pro porovnání a
a b
pole:
db.data.aggregate(
[
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $cmp: [ "$a", "$b" ] }
}
}
]
)
Výsledek:
{ "a" : 2, "b" : 2, "result" : 0 } { "a" : 2, "b" : 3, "result" : -1 } { "a" : 3, "b" : 2, "result" : 1 }
Porovnání různých typů
$cmp
operátor porovnává hodnotu i typ pomocí zadaného pořadí porovnání BSON pro hodnoty různých typů.
Předpokládejme, že do naší sbírky přidáme následující dokumenty:
{ "_id" : 4, "a" : ISODate("2021-01-03T23:30:15.100Z"), "b" : ISODate("2019-12-08T04:00:20.112Z") } { "_id" : 5, "a" : 2, "b" : ISODate("2019-12-08T04:00:20.112Z") } { "_id" : 6, "a" : ISODate("2019-12-08T04:00:20.112Z"), "b" : 2 } { "_id" : 7, "a" : null, "b" : 2 } { "_id" : 8, "a" : 2, "b" : null } { "_id" : 9, "a" : null, "b" : null } { "_id" : 10, "a" : Infinity, "b" : 3 } { "_id" : 11, "a" : 2, "b" : Infinity } { "_id" : 12, "a" : Infinity, "b" : Infinity }
Zde je to, co se stane, když použijeme $cmp
k novým dokumentům:
db.data.aggregate(
[
{ $match: { _id: { $nin: [ 1, 2, 3 ] } } },
{ $project: {
a: 1,
b: 1,
result: { $cmp: [ "$a", "$b" ] }
}
}
]
).pretty()
Výsledek:
{ "_id" : 4, "a" : ISODate("2021-01-03T23:30:15.100Z"), "b" : ISODate("2019-12-08T04:00:20.112Z"), "result" : 1 } { "_id" : 5, "a" : 2, "b" : ISODate("2019-12-08T04:00:20.112Z"), "result" : -1 } { "_id" : 6, "a" : ISODate("2019-12-08T04:00:20.112Z"), "b" : 2, "result" : 1 } { "_id" : 7, "a" : null, "b" : 2, "result" : -1 } { "_id" : 8, "a" : 2, "b" : null, "result" : 1 } { "_id" : 9, "a" : null, "b" : null, "result" : 0 } { "_id" : 10, "a" : Infinity, "b" : 3, "result" : 1 } { "_id" : 11, "a" : 2, "b" : Infinity, "result" : -1 } { "_id" : 12, "a" : Infinity, "b" : Infinity, "result" : 0 }