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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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の場合、使用する値はドライバーによって異なります。