W MongoDB $cmp
Operator potoku agregacji porównuje dwie wartości i zwraca albo -1
, 1
lub 0
, w zależności od tego, czy pierwsza wartość jest mniejsza, większa lub równa pierwszej wartości.
W szczególności $cmp
zwraca operator:
-1
jeśli pierwsza wartość jest mniejsza niż druga.1
jeśli pierwsza wartość jest większa od drugiej.0
jeśli te dwie wartości są równoważne.
Przykład
Załóżmy, że mamy kolekcję o nazwie data
z następującymi dokumentami:
{ "_id" : 1, "a" : 2, "b" : 2 } { "_id" : 2, "a" : 2, "b" : 3 } { "_id" : 3, "a" : 3, "b" : 2 }
Możemy użyć $cmp
operator do porównania a
i b
pola:
db.data.aggregate(
[
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $cmp: [ "$a", "$b" ] }
}
}
]
)
Wynik:
{ "a" : 2, "b" : 2, "result" : 0 } { "a" : 2, "b" : 3, "result" : -1 } { "a" : 3, "b" : 2, "result" : 1 }
Porównywanie różnych typów
$cmp
operator porównuje zarówno wartość, jak i typ, używając określonej kolejności porównania BSON dla wartości różnych typów.
Załóżmy, że do naszej kolekcji dodamy następujące 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 }
Oto, co się dzieje, gdy zastosujemy $cmp
do nowych dokumentów:
db.data.aggregate(
[
{ $match: { _id: { $nin: [ 1, 2, 3 ] } } },
{ $project: {
a: 1,
b: 1,
result: { $cmp: [ "$a", "$b" ] }
}
}
]
).pretty()
Wynik:
{ "_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 }