Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

$zip(集計)

項目一覧

  • 定義
  • 動作
$zip

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

たとえば、 $zip[ [ 1, 2, 3 ], [ "a", "b", "c" ] ][ [ 1, "a" ], [ 2, "b" ], [ 3, "c" ] ]に変換します。

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

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

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

inputs配列のいずれかがnullの値に解決されるか、欠落しているフィールドを参照する場合、 $zipnullを返します。

inputs配列のいずれかが配列またはnullに解決されず、欠落しているフィールドを参照しない場合、 $zipはエラーを返します。

useLongestLength

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

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

defaults

入力配列の長さが異なる場合に使用するデフォルトの要素値の配列。 このフィールドとともにuseLongestLength: trueを指定する必要があります。そうしないと、 $zipはエラーを返します。

useLongestLength: truedefaultsが空または指定されていない場合、 $zipはデフォルト値としてnullを使用します。

空でないdefaultsを指定する場合は、入力配列にデフォルトを指定する必要があります。そうしないと、 $zipはエラーを返します。

入力配列は同じ長さである必要はありません。 デフォルトでは、出力配列の長さは短い入力配列の長さですが、 useLongestLengthオプションは、最も長い入力配列と同じ長さの配列を出力するように$zipに指示します。

結果
{ $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 ] ]
}

戻る

$year

項目一覧