sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $strcasecmp

V MongoDB, $strcasecmp Operátor agregačního kanálu provádí porovnání dvou řetězců bez ohledu na velikost písmen.

Vrací buď 1 , 0 , nebo -1 , v závislosti na tom, zda je první řetězec větší, roven nebo menší než druhý řetězec.

Konkrétně $strcasecmp vrátí:

  • 1 pokud je první řetězec větší než druhý řetězec
  • 0 pokud jsou oba řetězce stejné
  • -1 pokud je první řetězec menší než druhý řetězec

Příklad

Předpokládejme, že máme kolekci nazvanou data s následujícími dokumenty:

{ "_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" }

Zde je to, co se stane, když použijeme $strcasecmp k těm dokumentům:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $strcasecmp: [ "$a", "$b" ] }
          }
     }
   ]
)

Výsledek:

{ "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 }

Rozlišovat malá a velká písmena

Jak již bylo zmíněno, $strcasecmp provede porovnání bez ohledu na velikost písmen.

Předpokládejme, že naše sbírka obsahuje následující dokument:

{ "_id" : 6, "a" : "ABC", "b" : "abc" }

a pole obsahuje řetězec velkých písmen a b pole obsahuje stejný řetězec, ale v malých písmenech.

Zde je to, co se stane, když použijeme $strcasecmp do obou polí:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $strcasecmp: [ "$a", "$b" ] }
          }
     }
   ]
)

Výsledek:

{ "a" : "ABC", "b" : "abc", "result" : 0 }

Výsledek je 0 , což znamená, že oba řetězce jsou stejné.

Jinými slovy, při srovnání se nerozlišovala malá a velká písmena.

Nulové hodnoty

$strcasecmp považuje dvě hodnoty null za stejné. Řetězec je také považován za větší než null .

Předpokládejme, že máme ve sbírce následující dokumenty:

{ "_id" : 7, "a" : "abc", "b" : null }
{ "_id" : 8, "a" : null, "b" : "abc" }
{ "_id" : 9, "a" : null, "b" : null }

Zde je to, co se stane, když použijeme $strcasecmp k těm dokumentům:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 7, 8 ,9 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $strcasecmp: [ "$a", "$b" ] }
          }
     }
   ]
)

Výsledek:

{ "a" : "abc", "b" : null, "result" : 1 }
{ "a" : null, "b" : "abc", "result" : -1 }
{ "a" : null, "b" : null, "result" : 0 }

Chybějící pole

Chybějící pole mají stejný účinek jako null .

Přidejme do naší sbírky následující dokumenty:

{ "_id" : 10, "a" : "abc" }
{ "_id" : 11, "b" : "abc" }
{ "_id" : 12 }

Zde je to, co se stane, když použijeme $strcasecmp jim:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 10, 11, 12 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $strcasecmp: [ "$a", "$b" ] }
          }
     }
   ]
)

Výsledek:

{ "a" : "abc", "result" : 1 }
{ "b" : "abc", "result" : -1 }
{ "result" : 0 }

Další typy dat

Jiné datové typy lze porovnávat, pokud je lze přeložit na řetězec.

Zde je spousta dokumentů, které obsahují různé typy dat:

{ "_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 co se stane, když použijeme $strcasecmp k těm dokumentům:

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()

Výsledek:

{ "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. Hotfix Mongodb KB2731284

  2. Jaký je správný způsob, jak zvládnout připojení Redis v Tornado? (Asynchronní – Pub/Sub)

  3. Filtrování vložených dokumentů v MongoDB

  4. Jak používat Node.js k vytvoření tunelového připojení SSH k databázi MongoDB