MongoDBでは、$arrayToObject
集約パイプライン演算子は、配列をドキュメントに変換します。
$arrayToObject
に提供される配列 次の2つの形式のいずれかである必要があります:
- 2要素配列の配列。最初の要素はフィールド名で、2番目の要素はフィールド値です。
-
k
を含むドキュメントの配列 フィールドとv
フィールド、ここでk
フィールドには、フィールド名とv
が含まれます フィールドには値が含まれます。
フォーマット1
test
というコレクションがあるとします。 次のドキュメントで:
{ "_id" : 1, "data" : [ [ "name", "Fetch" ], [ "type", "Dog" ] ] }
$arrayToObject
を使用できます data
を返す演算子 ドキュメントオブジェクトとしてのフィールド:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
結果:
{ "result" : { "name" : "Fetch", "type" : "Dog" } }
フォーマット2
次のようなドキュメントがあるとします。
{ "_id" : 2, "data" : [ { "k" : "name", "v" : "Fetch" }, { "k" : "type", "v" : "Dog" } ] }
この場合、k
フィールドには、キーとv
が含まれます フィールドには値が含まれています。
$arrayToObject
を適用すると次のようになります そのドキュメントへ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
結果:
{ "result" : { "name" : "Fetch", "type" : "Dog" } }
これにより、前の例で作成されたものと同じドキュメントが作成されたことがわかります。
不適合アレイ
$arrayToObject
に提供される引数 2要素配列の配列またはk
を含むドキュメントの配列に解決される限り、任意の有効な式にすることができます。 およびv
フィールド。
引数がこれに従わない場合、エラーが発生します。
次のドキュメントがあるとします。
{ "_id" : 3, "data" : [ [ "name", "Fetch", "Dog" ] ] }
この配列には3つの要素が含まれています。
$arrayToObject
を適用すると次のようになります そのドキュメントへ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
結果:
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
エラーが示すように、$arrayToObject requires an array of size 2 arrays
。
不適合な配列を含む別のドキュメントは次のとおりです。
{ "_id" : 4, "data" : [ { "a" : "name", "b" : "Fetch" } ] }
この場合、配列内のドキュメントはa
を使用します およびb
k
の代わりにフィールド およびv
。
$arrayToObject
を適用すると次のようになります :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
結果:
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
この場合、エラーは、$arrayToObject requires an object with keys 'k' and 'v'
。
間違ったタイプ
同様に、引数が配列でもない場合、エラーが発生します。
次のドキュメントがあるとします。
{ "_id" : 5, "data" : "None" }
data
フィールドに文字列が含まれています。
$arrayToObject
を適用すると次のようになります そのドキュメントへ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
結果:
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
エラーが示すように、$arrayToObject requires an array input
。
ヌル値
null
を提供する 結果はnull
。
次のドキュメントがあるとします。
{ "_id" : 6, "data" : null }
そして、$arrayToObject
を適用します :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
結果:
{ "result" : null }
欠落しているフィールド
フィールドが欠落している場合、結果はnull
になります 。
次のドキュメントがあるとします。
{ "_id" : 7 }
そして、$arrayToObject
を適用します :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
result: { $arrayToObject: "$data" } }
}
]
)
結果:
{ "result" : null }
フィールド名の繰り返し
MongoDBのドキュメントによると、フィールドの名前が配列内で繰り返される場合:
- 4.0.5以降、
$arrayToObject
そのフィールドの最後の値を使用します。 4.0.0-4.0.4の場合、使用される値はドライバーによって異なります。 - 3.6.10以降、
$arrayToObject
そのフィールドの最後の値を使用します。 3.6.0〜3.6.9の場合、使用される値はドライバーによって異なります。 - 3.4.19以降、
$arrayToObject
そのフィールドの最後の値を使用します。 3.4.0〜3.4.19の場合、使用する値はドライバーによって異なります。