Trong MongoDB, $mod
toán tử đường ống tổng hợp chia một số cho một số khác và trả về phần còn lại.
Để sử dụng $mod
, chuyển hai số trong một mảng. $mod
toán tử sẽ chia số đầu tiên cho số thứ hai và trả về phần còn lại. Nói cách khác, số đầu tiên là số bị chia và số thứ hai là số bị chia.
Các đối số có thể là bất kỳ biểu thức hợp lệ nào miễn là chúng phân giải thành số.
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" : 10, "b" : 2 } { "_id" : 2, "a" : 10, "b" : 3 } { "_id" : 3, "a" : 10.5, "b" : 2 }
Chúng ta có thể sử dụng $mod
toán tử trong một đường ống tổng hợp để phân chia a
trường của b
và trả về phần còn lại:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Kết quả:
{ "a" : 10, "b" : 2, "result" : 0 } { "a" : 10, "b" : 3, "result" : 1 } { "a" : 10.5, "b" : 2, "result" : 0.5 }
Nói cách khác, chúng ta nhận được a
modulo b
.
Nếu chúng ta muốn lấy b
modulo a
, chúng tôi sẽ cần hoán đổi chúng.
Ví dụ:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$b", "$a" ] } }
}
]
)
Kết quả:
{ "a" : 10, "b" : 2, "result" : 2 } { "a" : 10, "b" : 3, "result" : 3 } { "a" : 10.5, "b" : 2, "result" : 2 }
Số phủ định
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" : -10, "b" : 3 } { "_id" : 5, "a" : 10, "b" : -3 } { "_id" : 6, "a" : -10, "b" : -3 }
Chúng bao gồm các số âm. Nhưng đó không phải là vấn đề, bởi vì số âm vẫn là số và chúng tôi chắc chắn có thể nhận được mô-đun khi làm việc với số âm.
Ví dụ:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 4, 5, 6 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Kết quả:
{ "a" : -10, "b" : 3, "result" : -1 } { "a" : 10, "b" : -3, "result" : 1 } { "a" : -10, "b" : -3, "result" : -1 }
Loại dữ liệu sai
Các đối số được cung cấp cho $mod
có thể là bất kỳ biểu thức hợp lệ nào, miễn là chúng phân giải thành số.
Giả sử chúng ta có tài liệu sau:
{ "_id" : 7, "a" : "Ten", "b" : 2 }
Và chúng tôi áp dụng $mod
vào tài liệu đó:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Kết quả:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$mod only supports numeric types, not string and double", "code" : 16611, "codeName" : "Location16611" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
Lỗi nói rằng $mod only supports numeric types
.
Giá trị rỗng
Cung cấp null
đối với bất kỳ đối số nào trả về null
.
Giả sử chúng ta có các tài liệu sau:
{ "_id" : 8, "a" : 10, "b" : null } { "_id" : 9, "a" : null, "b" : 10 } { "_id" : 10, "a" : null, "b" : null }
Và chúng tôi áp dụng $mod
đối với các tài liệu đó:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 8, 9, 10 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Kết quả:
{ "a" : 10, "b" : null, "result" : null } { "a" : null, "b" : 10, "result" : null } { "a" : null, "b" : null, "result" : null }
Các trường bị thiếu
Các trường bị thiếu trả về null
.
Giả sử chúng ta có các tài liệu sau:
{ "_id" : 11, "a" : 10 } { "_id" : 12, "b" : 2 } { "_id" : 13 }
Áp dụng $mod
:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 11, 12, 13 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Kết quả:
{ "a" : 10, "result" : null } { "b" : 2, "result" : null } { "result" : null }
Thêm số riêng của bạn
Bạn không nhất thiết chỉ bị giới hạn ở các số trong / s tài liệu. Bạn có thể sử dụng các số của riêng mình nếu bạn cần chia một trường cho một số tiền cố định.
Ví dụ:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", 5.2 ] } }
}
]
)
Kết quả:
{ "a" : 10, "b" : 2, "result" : 4.8 } { "a" : 10, "b" : 3, "result" : 4.8 } { "a" : 10.5, "b" : 2, "result" : 0.09999999999999964 }