Dans MongoDB, le $strcasecmp
L'opérateur de pipeline d'agrégation effectue une comparaison insensible à la casse de deux chaînes.
Il renvoie soit 1
, 0
, ou -1
, selon que la première chaîne est ou non supérieure, égale ou inférieure à la deuxième chaîne.
Plus précisément, $strcasecmp
renvoie :
1
si la première chaîne est supérieure à la deuxième chaîne0
si les deux chaînes sont égales-1
si la première chaîne est inférieure à la deuxième chaîne
Exemple
Supposons que nous ayons une collection appelée data
avec les documents suivants :
{ "_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" }
Voici ce qui se passe lorsque nous appliquons $strcasecmp
à ces documents :
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
)
Résultat :
{ "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 }
Sensibilité à la casse
Comme mentionné, $strcasecmp
effectue une comparaison insensible à la casse.
Supposons que notre collection contienne le document suivant :
{ "_id" : 6, "a" : "ABC", "b" : "abc" }
Le a
le champ contient une chaîne en majuscule et le b
champ contient la même chaîne, mais en minuscules.
Voici ce qui se passe lorsque nous appliquons $strcasecmp
aux deux champs :
db.data.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
)
Résultat :
{ "a" : "ABC", "b" : "abc", "result" : 0 }
Le résultat est 0
, ce qui signifie que les deux chaînes sont égales.
En d'autres termes, la comparaison était insensible à la casse.
Valeurs nulles
Le $strcasecmp
traite deux valeurs nulles comme égales. De plus, une chaîne est considérée comme supérieure à null
.
Supposons que nous ayons les documents suivants dans notre collection :
{ "_id" : 7, "a" : "abc", "b" : null } { "_id" : 8, "a" : null, "b" : "abc" } { "_id" : 9, "a" : null, "b" : null }
Voici ce qui se passe lorsque nous appliquons $strcasecmp
à ces documents :
db.data.aggregate(
[
{ $match: { _id: { $in: [ 7, 8 ,9 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
)
Résultat :
{ "a" : "abc", "b" : null, "result" : 1 } { "a" : null, "b" : "abc", "result" : -1 } { "a" : null, "b" : null, "result" : 0 }
Champs manquants
Les champs manquants ont le même effet que null
.
Ajoutons les documents suivants à notre collection :
{ "_id" : 10, "a" : "abc" } { "_id" : 11, "b" : "abc" } { "_id" : 12 }
Voici ce qui se passe lorsque nous appliquons $strcasecmp
à eux :
db.data.aggregate(
[
{ $match: { _id: { $in: [ 10, 11, 12 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $strcasecmp: [ "$a", "$b" ] }
}
}
]
)
Résultat :
{ "a" : "abc", "result" : 1 } { "b" : "abc", "result" : -1 } { "result" : 0 }
Autres types de données
D'autres types de données peuvent être comparés, tant qu'ils peuvent être résolus en une chaîne.
Voici un ensemble de documents contenant différents types de données :
{ "_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" }
Et voici ce qui se passe lorsque nous appliquons $strcasecmp
à ces documents :
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()
Résultat :
{ "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 }