W MongoDB $strcasecmp Operator potoku agregacji wykonuje porównanie dwóch ciągów bez rozróżniania wielkości liter.
Zwraca albo 1 , 0 lub -1 , w zależności od tego, czy pierwszy ciąg jest większy, równy lub mniejszy niż drugi ciąg.
W szczególności $strcasecmp zwraca:
1jeśli pierwszy ciąg jest większy od drugiego0jeśli oba ciągi są równe-1jeśli pierwszy ciąg jest mniejszy od drugiego
Przykład
Załóżmy, że mamy kolekcję o nazwie data z następującymi dokumentami:
{ "_id" : 1, "a" : "abc", "b" : "def" }
{ "_id" : 2, "a" : "abc", "b" : "abc" }
{ "_id" : 3, "a" : "def", "b" : "abc" }
{ "_id" : 4, "a" : "abc", "b" : "cba" }
{ "_id" : 5, "a" : "cba", "b" : "abc" }
Oto, co się dzieje, gdy zastosujemy $strcasecmp do tych dokumentów:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
) Wynik:
{ "a" : "abc", "b" : "def", "result" : -1 }
{ "a" : "abc", "b" : "abc", "result" : 0 }
{ "a" : "def", "b" : "abc", "result" : 1 }
{ "a" : "abc", "b" : "cba", "result" : -1 }
{ "a" : "cba", "b" : "abc", "result" : 1 } Wrażliwość na wielkość liter
Jak wspomniano, $strcasecmp wykonuje porównanie bez rozróżniania wielkości liter.
Załóżmy, że nasza kolekcja zawiera następujący dokument:
{ "_id" : 6, "a" : "ABC", "b" : "abc" }
a pole zawiera ciąg pisany wielką literą, a b pole zawiera ten sam ciąg, ale małymi literami.
Oto, co się dzieje, gdy zastosujemy $strcasecmp do obu pól:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
) Wynik:
{ "a" : "ABC", "b" : "abc", "result" : 0 }
Wynik to 0 , co oznacza, że oba ciągi są równe.
Innymi słowy, porównanie nie uwzględniało wielkości liter.
Wartości puste
$strcasecmp traktuje dwie wartości null jako równe. Ponadto ciąg jest uważany za większy niż null .
Załóżmy, że w naszej kolekcji mamy następujące dokumenty:
{ "_id" : 7, "a" : "abc", "b" : null }
{ "_id" : 8, "a" : null, "b" : "abc" }
{ "_id" : 9, "a" : null, "b" : null }
Oto, co się dzieje, gdy zastosujemy $strcasecmp do tych dokumentów:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 7, 8 ,9 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
) Wynik:
{ "a" : "abc", "b" : null, "result" : 1 }
{ "a" : null, "b" : "abc", "result" : -1 }
{ "a" : null, "b" : null, "result" : 0 } Brakujące pola
Brakujące pola mają taki sam efekt jak null .
Dodajmy do naszej kolekcji następujące dokumenty:
{ "_id" : 10, "a" : "abc" }
{ "_id" : 11, "b" : "abc" }
{ "_id" : 12 }
Oto, co się dzieje, gdy zastosujemy $strcasecmp do nich:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 10, 11, 12 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
) Wynik:
{ "a" : "abc", "result" : 1 }
{ "b" : "abc", "result" : -1 }
{ "result" : 0 } Inne typy danych
Można porównywać inne typy danych, o ile można je rozwiązać jako ciąg.
Oto kilka dokumentów zawierających różne typy danych:
{ "_id" : 13, "a" : 123, "b" : 456 }
{ "_id" : 14, "a" : 123, "b" : 123 }
{ "_id" : 15, "a" : 456, "b" : 123 }
{ "_id" : 16, "a" : NumberDecimal("123"), "b" : NumberDecimal("456") }
{ "_id" : 17, "a" : NumberDecimal("123"), "b" : NumberDecimal("123") }
{ "_id" : 18, "a" : NumberDecimal("456"), "b" : NumberDecimal("123") }
{ "_id" : 19, "a" : ISODate("1999-01-03T23:30:15.100Z"), "b" : "2000-01-03T23:30:15.100Z" }
{ "_id" : 20, "a" : ISODate("2000-01-03T23:30:15.100Z"), "b" : "2000-01-03T23:30:15.100Z" }
{ "_id" : 21, "a" : ISODate("2000-01-03T23:30:15.100Z"), "b" : "1999-01-03T23:30:15.100Z" }
A oto, co się dzieje, gdy zastosujemy $strcasecmp do tych dokumentów:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 13, 14, 15, 16, 17, 18, 19, 20, 21 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
).pretty() Wynik:
{ "a" : 123, "b" : 456, "result" : -1 }
{ "a" : 123, "b" : 123, "result" : 0 }
{ "a" : 456, "b" : 123, "result" : 1 }
{ "a" : NumberDecimal("123"), "b" : NumberDecimal("456"), "result" : -1 }
{ "a" : NumberDecimal("123"), "b" : NumberDecimal("123"), "result" : 0 }
{ "a" : NumberDecimal("456"), "b" : NumberDecimal("123"), "result" : 1 }
{
"a" : ISODate("1999-01-03T23:30:15.100Z"),
"b" : "2000-01-03T23:30:15.100Z",
"result" : -1
}
{
"a" : ISODate("2000-01-03T23:30:15.100Z"),
"b" : "2000-01-03T23:30:15.100Z",
"result" : 0
}
{
"a" : ISODate("2000-01-03T23:30:15.100Z"),
"b" : "1999-01-03T23:30:15.100Z",
"result" : 1
}