MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $strcasecmp

В MongoDB, $strcasecmp Операторът на тръбопровода за агрегиране извършва сравнение на два низа, независимо от главните букви.

Връща или 1 , 0 , или -1 , в зависимост от това дали първият низ е по-голям, равен или по-малък от втория низ.

По-конкретно, $strcasecmp връща:

  • 1 ако първият низ е по-голям от втория низ
  • 0 ако и двата низа са равни
  • -1 ако първият низ е по-малък от втория низ

Пример

Да предположим, че имаме колекция, наречена data със следните документи:

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

Ето какво се случва, когато приложим $strcasecmp към тези документи:

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

Резултат:

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

Чувствителност на регистрите

Както споменахме, $strcasecmp извършва сравнение, независимо от главните букви.

Да предположим, че нашата колекция съдържа следния документ:

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

a полето съдържа низ с главни букви и b полето съдържа същия низ, но с малки букви.

Ето какво се случва, когато приложим $strcasecmp към двете полета:

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

Резултат:

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

Резултатът е 0 , което означава, че и двата низа са равни.

С други думи, сравнението беше независимо от главните букви.

Нулеви стойности

$strcasecmp третира две нулеви стойности като равни. Също така низът се счита за по-голям от null .

Да предположим, че имаме следните документи в нашата колекция:

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

Ето какво се случва, когато приложим $strcasecmp към тези документи:

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

Резултат:

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

Липсващи полета

Липсващите полета имат същия ефект като null .

Нека добавим следните документи към нашата колекция:

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

Ето какво се случва, когато приложим $strcasecmp към тях:

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

Резултат:

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

Други типове данни

Други типове данни могат да се сравняват, стига да могат да се разделят на низ.

Ето куп документи, които съдържат различни типове данни:

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

И ето какво се случва, когато приложим $strcasecmp към тези документи:

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

Резултат:

{ "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. MongoDB $toString

  2. най-добрата практика на обединяването на django + PyMongo?

  3. Извършване на изявление на случай в рамката за агрегиране на mongodb

  4. Как мога да хоствам собствен сървър за анализиране на Heroku, използвайки MongoDB?

  5. Meteor:разлика между имената на колекции, променливи, публикации и абонаменти?