Trong MongoDB, $arrayToObject
nhà điều hành đường ống tổng hợp chuyển đổi một mảng thành một tài liệu.
Mảng được cung cấp cho $arrayToObject
phải ở một trong hai định dạng sau:
- Một mảng gồm các mảng hai phần tử trong đó phần tử đầu tiên là tên trường và phần tử thứ hai là giá trị trường.
- Một mảng tài liệu chứa
k
và một trườngv
trường, trong đók
trường chứa tên trường vàv
trường chứa giá trị.
Định dạng 1
Giả sử chúng ta có một bộ sưu tập được gọi là test
với tài liệu sau:
{ "_id" : 1, "data" : [ [ "name", "Fetch" ], [ "type", "Dog" ] ] }
Chúng ta có thể sử dụng $arrayToObject
toán tử để trả về data
trường như một đối tượng tài liệu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Kết quả:
{ "result" : { "name" : "Fetch", "type" : "Dog" } }
Định dạng 2
Giả sử chúng ta có một tài liệu như sau:
{ "_id" : 2, "data" : [ { "k" : "name", "v" : "Fetch" }, { "k" : "type", "v" : "Dog" } ] }
Trong trường hợp này, k
các trường chứa các khóa và v
các trường chứa các giá trị.
Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $arrayToObject
vào tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Kết quả:
{ "result" : { "name" : "Fetch", "type" : "Dog" } }
Chúng ta có thể thấy rằng điều này dẫn đến cùng một tài liệu đã được tạo trong ví dụ trước.
Mảng không phù hợp
Đối số được cung cấp cho $arrayToObject
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 gồm mảng hai phần tử hoặc mảng tài liệu có chứa k
và v
các lĩnh vực.
Nếu đối số không tuân theo điều này, thì sẽ xảy ra lỗi.
Giả sử chúng ta có tài liệu sau:
{ "_id" : 3, "data" : [ [ "name", "Fetch", "Dog" ] ] }
Mảng này chứa ba phần tử.
Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $arrayToObject
vào tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Kết quả:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$arrayToObject requires an array of size 2 arrays,found array of size: 3", "code" : 40397, "codeName" : "Location40397" } : 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õ, $arrayToObject requires an array of size 2 arrays
.
Đây là một tài liệu khác có chứa một mảng không phù hợp:
{ "_id" : 4, "data" : [ { "a" : "name", "b" : "Fetch" } ] }
Trong trường hợp này, tài liệu trong mảng sử dụng a
và b
các trường thay vì k
và v
.
Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $arrayToObject
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Kết quả:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$arrayToObject requires an object with keys 'k' and 'v'. Missing either or both keys from: {a: \"name\", b: \"Fetch\"}", "code" : 40393, "codeName" : "Location40393" } : 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
Trong trường hợp này, lỗi nói rằng $arrayToObject requires an object with keys 'k' and 'v'
.
Loại sai
Tương tự, nếu đối số không phải là một mảng, thì sẽ xảy ra lỗi.
Giả sử chúng ta có tài liệu sau:
{ "_id" : 5, "data" : "None" }
Dữ liệu data
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 $arrayToObject
vào tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Kết quả:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$arrayToObject requires an array input, found: string", "code" : 40386, "codeName" : "Location40386" } : 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õ, $arrayToObject requires an array 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" : 6, "data" : null }
Và chúng tôi áp dụng $arrayToObject
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
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" : 7 }
Và chúng tôi áp dụng $arrayToObject
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
Kết quả:
{ "result" : null }
Tên trường lặp lại
Theo tài liệu MongoDB, nếu tên của một trường lặp lại trong mảng:
- Bắt đầu trong 4.0.5,
$arrayToObject
sử dụng giá trị cuối cùng cho trường đó. Đối với 4.0.0-4.0.4, giá trị được sử dụng tùy thuộc vào trình điều khiển. - Bắt đầu từ 3,6.10,
$arrayToObject
sử dụng giá trị cuối cùng cho trường đó. Đối với 3.6.0-3.6.9, giá trị được sử dụng tùy thuộc vào trình điều khiển. - Bắt đầu từ 3.4.19,
$arrayToObject
sử dụng giá trị cuối cùng cho trường đó. Đối với 3.4.0-3.4.19, giá trị sử dụng tùy thuộc vào trình điều khiển.