Trong MongoDB, $objectToArray
nhà điều hành đường ống tổng hợp chuyển đổi một tài liệu thành một mảng.
Mảng được tạo bởi $objectToArray
chứa một phần tử cho mỗi cặp trường / giá trị trong tài liệu gốc. Mỗi phần tử là một tài liệu chứa k
và một trường v
lĩnh vực:
-
k
trường chứa tên trường trong tài liệu gốc. -
v
trường chứa giá trị của trường trong tài liệu gốc.
Ví dụ
Giả sử chúng ta có một bộ sưu tập có tên là dogs
với tài liệu sau:
{ "_id" : 1, "name" : "Fetch", "specs" : { "height" : 400, "weight" : 55, "color" : "brown" } }
Chúng ta có thể sử dụng $objectToArray
toán tử để trả về specs
trường dưới dạng một mảng:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty()
Kết quả:
{ "result" : [ { "k" : "height", "v" : 400 }, { "k" : "weight", "v" : 55 }, { "k" : "color", "v" : "brown" } ] }
Tài liệu lồng nhau
$objectToArray
toán tử chỉ áp dụng cho trường cấp cao nhất. Nó không áp dụng đệ quy cho bất kỳ tài liệu nhúng nào.
Giả sử chúng ta có một tài liệu như sau:
{ "_id" : 2, "name" : "Wag", "specs" : { "height" : 50, "weight" : 5, "color" : { "eyes" : "brown", "coat" : "black" } } }
Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $objectToArray
vào tài liệu đó:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty()
Kết quả:
{ "result" : [ { "k" : "height", "v" : 50 }, { "k" : "weight", "v" : 5 }, { "k" : "color", "v" : { "eyes" : "brown", "coat" : "black" } } ] }
Trong trường hợp này, tài liệu cấp cao nhất được chuyển đổi thành k
/ v
nhưng tài liệu nhúng vẫn giống như trong tài liệu gốc.
Loại sai
Đối số được cung cấp cho $objectToArray
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 đối tượng tài liệu.
Nếu đối số không giải quyết được đối tượng tài liệu, thì sẽ xảy ra lỗi.
Giả sử chúng ta có tài liệu sau:
{ "_id" : 3, "name" : "Fetch", "specs" : "None" }
specs
trường chứa một chuỗi.
Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $objectToArray
vào tài liệu đó:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Kết quả:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$objectToArray requires a document input, found: string", "code" : 40390, "codeName" : "Location40390" } : 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
Khi lỗi nêu rõ, $objectToArray requires a document input
.
Giá trị rỗng
Cung cấp null
kết quả là null
.
Giả sử chúng ta có tài liệu sau:
{ "_id" : 4, "name" : "Fetch", "specs" : null }
Và chúng tôi áp dụng $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Kết quả:
{ "result" : null }
Các trường bị thiếu
Nếu trường bị thiếu, kết quả là null
.
Giả sử chúng ta có tài liệu sau:
{ "_id" : 5, "name" : "Fetch" }
Và chúng tôi áp dụng $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Kết quả:
{ "result" : null }