sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $strcasecmp

I MongoDB, $strcasecmp aggregationspipeline-operatör utför en skiftlägesokänslig jämförelse av två strängar.

Den returnerar antingen 1 , 0 , eller -1 , beroende på om den första strängen är större än, lika med eller mindre än den andra strängen eller inte.

Specifikt $strcasecmp returnerar:

  • 1 om den första strängen är större än den andra strängen
  • 0 om båda strängarna är lika
  • -1 om den första strängen är mindre än den andra strängen

Exempel

Anta att vi har en samling som heter data med följande dokument:

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

Det här är vad som händer när vi använder $strcasecmp till dessa dokument:

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

Resultat:

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

Skaftkänslighet

Som nämnts, $strcasecmp utför en skiftlägesokänslig jämförelse.

Anta att vår samling innehåller följande dokument:

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

a fältet innehåller en versalsträng och b fältet innehåller samma sträng, men med gemener.

Det här är vad som händer när vi använder $strcasecmp till båda fälten:

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

Resultat:

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

Resultatet är 0 , vilket betyder att båda strängarna är lika.

Med andra ord var jämförelsen skiftlägesokänslig.

Nullvärden

$strcasecmp behandlar två nollvärden som lika. Dessutom anses en sträng vara större än null .

Anta att vi har följande dokument i vår samling:

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

Det här är vad som händer när vi använder $strcasecmp till dessa dokument:

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

Resultat:

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

Fält saknas

Saknade fält har samma effekt som null .

Låt oss lägga till följande dokument till vår samling:

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

Det här är vad som händer när vi använder $strcasecmp till dem:

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

Resultat:

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

Andra datatyper

Andra datatyper kan jämföras, så länge de kan lösas till en sträng.

Här är ett gäng dokument som innehåller olika datatyper:

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

Och här är vad som händer när vi använder $strcasecmp till dessa dokument:

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

Resultat:

{ "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. Hur anropar man funktionen efter att ha slutfört asynkrona funktioner inuti loopen?

  2. Inuti Apache HBases nya stöd för MOB

  3. Hur man skapar bönan av FindByIndexNameSessionRepository

  4. Redis pipelined order för utförande