В MongoDB, $cmp Операторът на конвейера за агрегиране сравнява две стойности и връща -1 , 1 или 0 , в зависимост от това дали първата стойност е по-малка, по-голяма или равна на първата стойност.
По-конкретно, $cmp операторът връща:
-1ако първата стойност е по-малка от втората.1ако първата стойност е по-голяма от втората.0ако двете стойности са еквивалентни.
Пример
Да предположим, че имаме колекция, наречена data със следните документи:
{ "_id" : 1, "a" : 2, "b" : 2 }
{ "_id" : 2, "a" : 2, "b" : 3 }
{ "_id" : 3, "a" : 3, "b" : 2 }
Можем да използваме $cmp оператор за сравнение на a и b полета:
db.data.aggregate(
[
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $cmp: [ "$a", "$b" ] }
}
}
]
) Резултат:
{ "a" : 2, "b" : 2, "result" : 0 }
{ "a" : 2, "b" : 3, "result" : -1 }
{ "a" : 3, "b" : 2, "result" : 1 } Сравняване на различни типове
$cmp оператор сравнява както стойност, така и тип, като използва посочения ред за сравнение на BSON за стойности от различни типове.
Да предположим, че добавяме следните документи към нашата колекция:
{ "_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 }
Ето какво се случва, когато приложим $cmp към новите документи:
db.data.aggregate(
[
{ $match: { _id: { $nin: [ 1, 2, 3 ] } } },
{ $project: {
a: 1,
b: 1,
result: { $cmp: [ "$a", "$b" ] }
}
}
]
).pretty() Резултат:
{
"_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 }