Trong MongoDB, $eq
toán tử đường ống tổng hợp so sánh hai giá trị và trả về true
hoặc false
, tùy thuộc vào việc hai giá trị có tương đương hay khô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" : 250, "b" : 250 } { "_id" : 2, "a" : 250, "b" : 100 }
Chúng ta có thể sử dụng $eq
toán tử để so sánh a
và b
lĩnh vực:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2 ] } } },
{
$project:
{
a: 1,
b: 1,
isEquivalent: { $eq: [ "$a", "$b" ] }
}
}
]
)
Kết quả:
{ "_id" : 1, "a" : 250, "b" : 250, "isEquivalent" : true } { "_id" : 2, "a" : 250, "b" : 100, "isEquivalent" : false }
Trong tài liệu đầu tiên, a
và b
các trường tương đương nhau, dẫn đến giá trị trả về là true
. Nhưng trong tài liệu thứ hai, chúng không tương đương với nhau, dẫn đến giá trị trả về là false
.
So sánh các loại
$eq
toán tử so sánh cả giá trị và kiểu bằng cách 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ử bộ sưu tập của chúng tôi chứa các tài liệu sau:
{ "_id" : 3, "a" : 250, "b" : "250" } { "_id" : 4, "a" : 250, "b" : NumberDecimal("250") } { "_id" : 5, "a" : NumberDecimal("250"), "b" : NumberDecimal("250.00") } { "_id" : 6, "a" : "2021-01-03T23:30:15.100Z", "b" : ISODate("2021-01-03T23:30:15.100Z") }
Chúng tôi có thể áp dụng $eq
tới a
và b
các trường của các tài liệu đó:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 3, 4, 5, 6 ] } } },
{
$project:
{
a: 1,
b: 1,
isEquivalent: { $eq: [ "$a", "$b" ] }
}
}
]
).pretty()
Kết quả:
{ "_id" : 3, "a" : 250, "b" : "250", "isEquivalent" : false } { "_id" : 4, "a" : 250, "b" : NumberDecimal("250"), "isEquivalent" : true } { "_id" : 5, "a" : NumberDecimal("250"), "b" : NumberDecimal("250.00"), "isEquivalent" : true } { "_id" : 6, "a" : "2021-01-03T23:30:15.100Z", "b" : ISODate("2021-01-03T23:30:15.100Z"), "isEquivalent" : false }
Trong tài liệu 3, cả a
và b
có giá trị 250
, nhưng nếu bạn xem kỹ b
, nó là một chuỗi (nó được bao quanh bởi dấu ngoặc kép). Do đó, tài liệu đầu tiên trả về false
.
Tài liệu 4 trả về true
vì cả hai trường đều chứa 250
và cả hai đều là số. Điều này đúng mặc dù a
là một kép và b
là một số thập phân.
Tài liệu 5 trả về true
bởi vì cả hai đều là số thập phân và cả hai đều có cùng giá trị (ngay cả khi một thứ sử dụng rõ ràng chữ số thập phân và người kia thì không).
Tài liệu 6 trả về false
bởi vì, mặc dù giá trị ngày / giờ hoàn toàn giống nhau, chúng sử dụng các kiểu khác nhau để biểu thị ngày đó (a
sử dụng chuỗi ngày / giờ và b
sử dụng đối tượng Ngày).
Giá trị rỗng
So sánh giá trị với null
trả về false
, trừ khi cả hai đều null
.
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" : 7, "a" : 250, "b" : null } { "_id" : 8, "a" : null, "b" : null }
Hãy áp dụng $eq
đối với các tài liệu đó:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 7, 8 ] } } },
{
$project:
{
a: 1,
b: 1,
isEquivalent: { $eq: [ "$a", "$b" ] }
}
}
]
)
Kết quả:
{ "_id" : 7, "a" : 250, "b" : null, "isEquivalent" : false } { "_id" : 8, "a" : null, "b" : null, "isEquivalent" : true }
Các trường bị thiếu
Nếu một trong các trường bạn đang cố gắng so sánh bị thiếu, hãy $eq
trả về false
.
Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:
{ "_id" : 9, "a" : 250 }
Hãy áp dụng $eq
vào tài liệu đó:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 9 ] } } },
{
$project:
{
a: 1,
b: 1,
isEquivalent: { $eq: [ "$a", "$b" ] }
}
}
]
)
Kết quả:
{ "_id" : 9, "a" : 250, "isEquivalent" : false }
Vô cực
So sánh Infinity
thành Infinity
trả về true
.
So sánh -Infinity
thành -Infinity
trả về true
.
So sánh Infinity
thành -Infinity
trả về false
.
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" : 10, "a" : Infinity, "b" : Infinity } { "_id" : 11, "a" : -Infinity, "b" : -Infinity } { "_id" : 12, "a" : Infinity, "b" : -Infinity }
Hãy áp dụng $eq
đối với các tài liệu đó:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 10, 11, 12 ] } } },
{
$project:
{
a: 1,
b: 1,
isEquivalent: { $eq: [ "$a", "$b" ] }
}
}
]
)
Kết quả:
{ "_id" : 10, "a" : Infinity, "b" : Infinity, "isEquivalent" : true } { "_id" : 11, "a" : -Infinity, "b" : -Infinity, "isEquivalent" : true } { "_id" : 12, "a" : Infinity, "b" : -Infinity, "isEquivalent" : false }