Trong MongoDB, $pow
toán tử đường ống tổng hợp tăng một số thành số mũ được chỉ định và trả về kết quả
$pow
chấp nhận hai biểu thức, được cung cấp trong một mảng. Cái đầu tiên là số, và cái thứ hai là số mũ. Cả hai đều 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 một số.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là test
với các tài liệu sau:
{ "_id" : 1, "data" : 10 } { "_id" : 2, "data" : -3 } { "_id" : 3, "data" : 0 } { "_id" : 4, "data" : null }
Chúng ta có thể sử dụng $pow
toán tử để nâng cao dữ liệu data
trường bởi một số mũ được chỉ định:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", 3 ] }
}
}
]
)
Kết quả:
{ "result" : 1000 } { "result" : -27 } { "result" : 0 } { "result" : null }
Trong trường hợp này, tôi đã sử dụng data
trường dưới dạng số và 3
dưới dạng số mũ. Do đó, mỗi tài liệu có data
trường được nâng lên bởi lũy thừa của 3.
Chúng ta có thể thấy rằng null
giá trị trả về null
.
Kết quả thường cùng kiểu với đầu vào. Tuy nhiên, có những trường hợp ngoại lệ cho quy tắc này. Cụ thể:
- Một số nguyên 32 bit sẽ được chuyển đổi thành số nguyên 64 bit nếu kết quả có thể biểu diễn dưới dạng số nguyên 64 bit.
- Một số nguyên 32 bit sẽ được chuyển đổi thành số kép nếu kết quả không thể biểu diễn dưới dạng số nguyên 64 bit.
- Một số nguyên 64 bit sẽ được chuyển đổi thành gấp đôi nếu kết quả không thể biểu diễn dưới dạng số nguyên 64 bit.
Số mũ âm
Bạn không thể tăng số 0 (0
) thành số mũ âm.
Ví dụ:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
result: { $pow: [ "$data", -3 ] }
}
}
]
)
Kết quả:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$pow cannot take a base of 0 and a negative exponent", "code" : 28764, "codeName" : "Location28764" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Lỗi nói rõ rằng “ $ pow không thể nhận cơ số 0 và số mũ âm “.
Tuy nhiên, nếu chúng tôi loại trừ tài liệu 3, chúng tôi không còn gặp lỗi:
db.test.aggregate(
[
{ $match: { _id: { $nin: [ 3 ] } } },
{ $project: {
result: { $pow: [ "$data", -3 ] }
}
}
]
)
Kết quả:
{ "_id" : 1, "result" : 0.001 } { "_id" : 2, "result" : -0.037037037037037035 } { "_id" : 4, "result" : null }
Giá trị NaN
Nếu đối số phân giải thành NaN
, $pow
trả về NaN
.
Ví dụ:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data" * 1, 3 ] }
}
}
]
)
Kết quả:
{ "result" : NaN } { "result" : NaN } { "result" : NaN } { "result" : NaN }
Các trường không tồn tại
Nếu $pow
toán tử được áp dụng cho một trường không tồn tại, null
được trả lại.
Ví dụ:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$beer", 3 ] }
}
}
]
)
Kết quả:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }
Null Exponent
Chúng tôi đã thấy rằng một null
giá trị trả về null
. Điều này cũng đúng khi cung cấp null
dưới dạng số mũ.
Ví dụ:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", null ] }
}
}
]
)
Kết quả:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }