Trong MongoDB, $cmp
toán tử đường ống tổng hợp so sánh hai giá trị và trả về -1
, 1
hoặc 0
, tùy thuộc vào việc giá trị đầu tiên nhỏ hơn, lớn hơn hoặc bằng giá trị đầu tiên.
Cụ thể, $cmp
toán tử trả về:
-
-1
nếu giá trị đầu tiên nhỏ hơn giá trị thứ hai. -
1
nếu giá trị đầu tiên lớn hơn giá trị thứ hai. -
0
nếu hai giá trị tương đương.
Ví dụ
Giả sử chúng ta có một tập hợp được gọi là data
với các tài liệu sau:
{ "_id" : 1, "a" : 2, "b" : 2 } { "_id" : 2, "a" : 2, "b" : 3 } { "_id" : 3, "a" : 3, "b" : 2 }
Chúng ta có thể sử dụng $cmp
toán tử để so sánh a
và b
lĩnh vực:
db.data.aggregate(
[
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $cmp: [ "$a", "$b" ] }
}
}
]
)
Kết quả:
{ "a" : 2, "b" : 2, "result" : 0 } { "a" : 2, "b" : 3, "result" : -1 } { "a" : 3, "b" : 2, "result" : 1 }
So sánh các loại khác nhau
$cmp
toán tử so sánh cả giá trị và kiểu, sử dụng thứ tự so sánh BSON được chỉ định cho các giá trị của các kiểu khác nhau.
Giả sử chúng tôi thêm các tài liệu sau vào bộ sưu tập của mình:
{ "_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 }
Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $cmp
sang các tài liệu mới:
db.data.aggregate(
[
{ $match: { _id: { $nin: [ 1, 2, 3 ] } } },
{ $project: {
a: 1,
b: 1,
result: { $cmp: [ "$a", "$b" ] }
}
}
]
).pretty()
Kết quả:
{ "_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 }