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 }