On this page
$zip (aggregation)
在本页面
Definition
$zip
- 3.4 版的新功能。
转置 Importing 数组的数组,以便输出数组的第一个元素将是包含以下内容的数组:第一个 Importing 数组的第一个元素,第二个 Importing 数组的第一个元素,等等。
例如,$zip将[ [ 1, 2, 3 ], [ "a", "b", "c" ] ]
转换为[ [ 1, "a" ], [ 2, "b" ], [ 3, "c" ] ]
。
$zip具有以下语法:
{
$zip: {
inputs: [ <array expression1>, ... ],
useLongestLength: <boolean>,
defaults: <array expression>
}
}
Operand | Description |
---|---|
inputs |
expressions数组,可解析为数组。这些 Importing 数组的元素组合形成输出数组的数组。 |
如果inputs
数组中的任何一个解析为null
的值或引用缺少的字段,则$zip返回null
。
如果inputs
数组中的任何一个都不能解析为数组或null
,也没有引用丢失的字段,则$zip返回错误。
| useLongestLength
|一个布尔值,它指定最长数组的长度是否确定输出数组中的数组数。
默认值为false
:最短的数组长度确定输出数组中的数组数。
| defaults
|如果 Importing 数组的长度不同,则使用默认元素值的数组。您必须在此字段中指定useLongestLength: true
,否则$zip将返回错误。
如果useLongestLength: true
但defaults
为空或未指定,则$zip使用null
作为默认值。
如果指定非空defaults
,则必须为* each *Importing 数组指定默认值,否则$zip将返回错误。
Behavior
Importing 数组的长度不必相同。默认情况下,输出数组的长度为最短 Importing 数组的长度,但是useLongestLength
选项指示$zip输出与最长 Importing 数组一样长的数组。
Example | Results |
---|---|
{ $zip: { inputs: [ [ "a" ], [ "b" ], [ "c" ] ] } |
[ [ "a", "b", "c" ] ] |
{ $zip: { inputs: [ [ "a" ], [ "b", "c" ] ] } } |
[ [ "a", "b" ] ] |
{ | |
$zip: { Importing:[[49],[50]], useLongestLength: true } } |
[ [ 1, 2 ], [ null, 3 ] ] |
{ $zip: { Importing:[[52],[53],[54]], useLongestLength: true, defaults: [ “ a”,“ b”,“ c”] } } |
由于useLongestLength: true ,$zip 将用相应的defaults 元素填充较短的 Importing 数组。这产生 [ [ 1, 2, 4 ], [ "a", 3, "c" ] ] 。 |
Example
Matrix Transposition
名为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.save( {
"category": "unix",
"pages": [
{ "title": "awk for beginners", reviews: 5 },
{ "title": "sed for newbies", reviews: 0 },
{ "title": "grep made simple", reviews: 2 },
] } )
以下聚合管道将首先将pages
数组的元素及其索引压缩在一起,然后仅过滤出至少经过一次审核的页面:
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 ] ]
}