Trong MongoDB, $size
toán tử đường ống tổng hợp đếm và trả về tổng số mục trong một mảng.
$size
toán tử chấp nhận một đối số. Đối số có thể là bất kỳ biểu thức hợp lệ nào phân giải thành một mảng.
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" : [ ] } { "_id" : 2, "data" : [ "a" ] } { "_id" : 3, "data" : [ "a", "b" ] } { "_id" : 4, "data" : [ "a", "b", "c" ] } { "_id" : 5, "data" : [ 1, 1, 1, 1 ] }
Chúng tôi có thể sử dụng $size
để trả về số lượng mục trong các mảng trong dữ liệu data
tương ứng các lĩnh vực.
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Kết quả:
{ "data" : [ ], "result" : 0 } { "data" : [ "a" ], "result" : 1 } { "data" : [ "a", "b" ], "result" : 2 } { "data" : [ "a", "b", "c" ], "result" : 3 } { "data" : [ 1, 1, 1, 1 ], "result" : 4 }
Mảng lồng nhau
$size
toán tử không đi xuống các mảng lồng nhau và đếm các phần tử của chúng. Nó đánh giá mảng từ cấp cao nhất.
Giả sử chúng ta có tài liệu sau trong bộ sưu tập của mình:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
Và chúng tôi áp dụng $size
về điều đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Kết quả:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
Mảng lồng nhau được tính là một phần tử (bất kể nó chứa bao nhiêu phần tử).
Loại dữ liệu sai
Đối số có thể là bất kỳ biểu thức hợp lệ nào, miễn là nó phân giải thành một mảng. Nếu nó không giải quyết được một mảng, thì một lỗi sẽ được tạo ra.
Giả sử chúng ta có tài liệu sau:
{ "_id" : 7, "data" : 3 }
Dữ liệu data
trường không phân giải thành một mảng.
Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $size
vào trường đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Kết quả:
Error: command failed: { "ok" : 0, "errmsg" : "The argument to $size must be an array, but was of type: double", "code" : 17124, "codeName" : "Location17124" } : 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
Thông báo lỗi cho chúng ta biết rằng The argument to $size must be an array, but was of type: double
.
Các trường bị thiếu
Nếu trường không tồn tại trong tài liệu, một lỗi sẽ được trả về.
Giả sử chúng ta có tài liệu sau:
{ "_id" : 8 }
Và chúng tôi áp dụng $size
vào tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Kết quả:
Error: command failed: { "ok" : 0, "errmsg" : "The argument to $size must be an array, but was of type: missing", "code" : 17124, "codeName" : "Location17124" } : 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