MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $strcasecmp

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:

  • 1 jeśli pierwszy ciąg jest większy od drugiego
  • 0 jeśli oba ciągi są równe
  • -1 jeś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
}

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Unikalny indeks w manguście nie działa

  2. Uzyskiwanie agregacji Mongo wyjątku wskaźnika zerowego przy użyciu danych wiosennych (pola dynamiczne)

  3. MongoDB:Używanie dopasowania ze zmiennymi dokumentu wejściowego

  4. MongoDB $setIsSubset

  5. jak wysłać dowolny obiekt json do webapi