AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

$zip(演算子)

$zip

入力配列の配列を変換して、出力配列の最初の要素は、最初の入力配列の最初の要素、2 番目の入力配列の最初の要素などを含む配列になります。

For example, $zip would transform [ [ 1, 2, 3 ], [ "a", "b", "c" ] ] into [ [ 1, "a" ], [ 2, "b" ], [ 3, "c" ] ].

$zip の構文は次のとおりです。

{
$zip: {
inputs: [ <expression1>, <expression2>, ... ],
useLongestLength: <boolean>,
defaults: <array expression>
}
}
オペランド
説明

inputs

配列に解決される式の配列。 これらの入力配列の要素が結合されて、出力配列の配列が作成されます。

If any of the inputs arrays resolves to a value of null or refers to a missing field, $zip returns null.

If any of the inputs arrays does not resolve to an array or null nor refers to a missing field, $zip returns an error.

useLongestLength

最も長い配列の長さによって出力配列内の配列の数が決定されるかどうかを指定するブール値。

デフォルト値はfalseです。配列の長さは短い方で、出力配列内の配列数が決まります。

defaults

An expression that resolves to an array of default element values to use if the input arrays have different lengths. You must specify useLongestLength: true along with this field, or else $zip will return an error.

If useLongestLength: true but defaults is empty or not specified, $zip uses null as the default value.

If specifying a non-empty defaults, you must specify a default for each input array or else $zip will return an error.

The input arrays do not need to be of the same length. By default, the output array has the length of the shortest input array, but the useLongestLength option instructs $zip to output an array as long as the longest input array.

例
結果
{ $zip: { inputs: [ [ "a" ], [ "b" ], [ "c" ] ] }
[ [ "a", "b", "c" ] ]
{ $zip: { inputs: [ [ "a" ], [ "b", "c" ] ] } }
[ [ "a", "b" ] ]
{
$zip: {
inputs: [ [ 1 ], [ 2, 3 ] ],
useLongestLength: true
}
}
[ [ 1, 2 ], [ null, 3 ] ]
{
$zip: {
inputs: [ [ 1 ], [ 2, 3 ], [ 4 ] ],
useLongestLength: true,
defaults: [ "a", "b", "c" ]
}
}

useLongestLength: trueであるため、 $zipは対応するdefaults要素で短い入力配列を埋め込みます。

これにより[ [ 1, 2, 4 ], [ "a", 3, "c" ] ]が生成されます。

matricesというコレクションには次のドキュメントが含まれています。

db.matrices.insertMany([
{ matrix: [[1, 2], [2, 3], [3, 4]] },
{ matrix: [[8, 7], [7, 6], [5, 4]] },
])

このコレクション内の各 3x2 マトリックスのトランスポートを計算するには、次の集計操作を使用できます。

db.matrices.aggregate([{
$project: {
_id: false,
transposed: {
$zip: {
inputs: [
{ $arrayElemAt: [ "$matrix", 0 ] },
{ $arrayElemAt: [ "$matrix", 1 ] },
{ $arrayElemAt: [ "$matrix", 2 ] },
]
}
}
}
}])

これにより、次の 2x3 のマトリックスが返されます。

{ "transposed" : [ [ 1, 2, 3 ], [ 2, 3, 4 ] ] }
{ "transposed" : [ [ 8, 7, 5 ], [ 7, 6, 4 ] ] }

$zipを$filterと併用すると、配列内の要素のサブセットを取得でき、保持された各要素と一緒に元のインデックスを保存できます。

pagesというコレクションには次のドキュメントが含まれています。

db.pages.insertOne( {
"category": "unix",
"pages": [
{ "title": "awk for beginners", reviews: 5 },
{ "title": "sed for newbies", reviews: 0 },
{ "title": "grep made simple", reviews: 2 },
] } )

次の集計パイプラインでは、まずpages配列の要素をインデックスとともに zip 化し、次に少なくとも 1 件のレビューがあるページのみをフィルタリングで除外します。

db.pages.aggregate([{
$project: {
_id: false,
pages: {
$filter: {
input: {
$zip: {
inputs: [ "$pages", { $range: [0, { $size: "$pages" }] } ]
}
},
as: "pageWithIndex",
cond: {
$let: {
vars: {
page: { $arrayElemAt: [ "$$pageWithIndex", 0 ] }
},
in: { $gte: [ "$$page.reviews", 1 ] }
}
}
}
}
}
}])

これにより、次のドキュメントが返されます。

{
"pages" : [
[ { "title" : "awk for beginners", "reviews" : 5 }, 0 ],
[ { "title" : "grep made simple", "reviews" : 2 }, 2 ] ]
}
このページを評価

項目一覧