No MongoDB, o
$strcasecmp
o operador de pipeline de agregação executa uma comparação que não diferencia maiúsculas de minúsculas de duas strings. Ele retorna
1
, 0
, ou -1
, dependendo se a primeira string é maior, igual ou menor que a segunda string. Especificamente,
$strcasecmp
retorna:1
se a primeira string for maior que a segunda string0
se ambas as strings forem iguais-1
se a primeira string for menor que a segunda string
Exemplo
Suponha que tenhamos uma coleção chamada
data
com os seguintes documentos:{ "_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" }
Veja o que acontece quando aplicamos
$strcasecmp
a esses documentos:db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
)
Resultado:
{ "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 }
Sensibilidade de maiúsculas e minúsculas
Como mencionado,
$strcasecmp
executa uma comparação que não diferencia maiúsculas de minúsculas. Suponha que nossa coleção contenha o seguinte documento:
{ "_id" : 6, "a" : "ABC", "b" : "abc" }
O
a
O campo contém uma string maiúscula e o b
O campo contém a mesma string, mas em letras minúsculas. Veja o que acontece quando aplicamos
$strcasecmp
para ambos os campos:db.data.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
)
Resultado:
{ "a" : "ABC", "b" : "abc", "result" : 0 }
O resultado é
0
, o que significa que ambas as strings são iguais. Em outras palavras, a comparação não diferencia maiúsculas de minúsculas.
Valores nulos
O
$strcasecmp
trata dois valores nulos como iguais. Além disso, uma string é considerada maior que null
. Suponha que temos os seguintes documentos em nossa coleção:
{ "_id" : 7, "a" : "abc", "b" : null } { "_id" : 8, "a" : null, "b" : "abc" } { "_id" : 9, "a" : null, "b" : null }
Veja o que acontece quando aplicamos
$strcasecmp
a esses documentos:db.data.aggregate(
[
{ $match: { _id: { $in: [ 7, 8 ,9 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
)
Resultado:
{ "a" : "abc", "b" : null, "result" : 1 } { "a" : null, "b" : "abc", "result" : -1 } { "a" : null, "b" : null, "result" : 0 }
Campos ausentes
Campos ausentes têm o mesmo efeito que
null
. Vamos adicionar os seguintes documentos à nossa coleção:
{ "_id" : 10, "a" : "abc" } { "_id" : 11, "b" : "abc" } { "_id" : 12 }
Veja o que acontece quando aplicamos
$strcasecmp
para eles:db.data.aggregate(
[
{ $match: { _id: { $in: [ 10, 11, 12 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
)
Resultado:
{ "a" : "abc", "result" : 1 } { "b" : "abc", "result" : -1 } { "result" : 0 }
Outros tipos de dados
Outros tipos de dados podem ser comparados, desde que possam ser resolvidos em uma string.
Aqui estão alguns documentos que contêm vários tipos de dados:
{ "_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" }
E aqui está o que acontece quando aplicamos
$strcasecmp
a esses documentos: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()
Resultado:
{ "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 }