sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $ cmp

En MongoDB, el $cmp el operador de canalización de agregación compara dos valores y devuelve -1 , 1 , o 0 , dependiendo de si el primer valor es menor, mayor o igual que el primer valor.

Específicamente, el $cmp el operador devuelve:

  • -1 si el primer valor es menor que el segundo.
  • 1 si el primer valor es mayor que el segundo.
  • 0 si los dos valores son equivalentes.

Ejemplo

Supongamos que tenemos una colección llamada data con los siguientes documentos:

{ "_id" : 1, "a" : 2, "b" : 2 }
{ "_id" : 2, "a" : 2, "b" : 3 }
{ "_id" : 3, "a" : 3, "b" : 2 }

Podemos usar el $cmp operador para comparar el a y b campos:

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

Resultado:

{ "a" : 2, "b" : 2, "result" : 0 }
{ "a" : 2, "b" : 3, "result" : -1 }
{ "a" : 3, "b" : 2, "result" : 1 }

Comparando diferentes tipos

El $cmp El operador compara tanto el valor como el tipo, usando el orden de comparación BSON especificado para valores de diferentes tipos.

Supongamos que agregamos los siguientes documentos a nuestra colección:

{ "_id" : 4, "a" : ISODate("2021-01-03T23:30:15.100Z"), "b" : ISODate("2019-12-08T04:00:20.112Z") }
{ "_id" : 5, "a" : 2, "b" : ISODate("2019-12-08T04:00:20.112Z") }
{ "_id" : 6, "a" : ISODate("2019-12-08T04:00:20.112Z"), "b" : 2 }
{ "_id" : 7, "a" : null, "b" : 2 }
{ "_id" : 8, "a" : 2, "b" : null }
{ "_id" : 9, "a" : null, "b" : null }
{ "_id" : 10, "a" : Infinity, "b" : 3 }
{ "_id" : 11, "a" : 2, "b" : Infinity }
{ "_id" : 12, "a" : Infinity, "b" : Infinity }

Esto es lo que sucede cuando aplicamos $cmp a los nuevos documentos:

db.data.aggregate(
  [
    { $match: { _id: { $nin: [ 1, 2, 3 ] } } },
    { $project: { 
        a: 1,
        b: 1,
        result: { $cmp: [ "$a", "$b" ] }
      }
    }
  ]
).pretty()

Resultado:

{
	"_id" : 4,
	"a" : ISODate("2021-01-03T23:30:15.100Z"),
	"b" : ISODate("2019-12-08T04:00:20.112Z"),
	"result" : 1
}
{
	"_id" : 5,
	"a" : 2,
	"b" : ISODate("2019-12-08T04:00:20.112Z"),
	"result" : -1
}
{
	"_id" : 6,
	"a" : ISODate("2019-12-08T04:00:20.112Z"),
	"b" : 2,
	"result" : 1
}
{ "_id" : 7, "a" : null, "b" : 2, "result" : -1 }
{ "_id" : 8, "a" : 2, "b" : null, "result" : 1 }
{ "_id" : 9, "a" : null, "b" : null, "result" : 0 }
{ "_id" : 10, "a" : Infinity, "b" : 3, "result" : 1 }
{ "_id" : 11, "a" : 2, "b" : Infinity, "result" : -1 }
{ "_id" : 12, "a" : Infinity, "b" : Infinity, "result" : 0 }