PDI:同时展开 MongoDB 中的两个数组

PDI: Simultaneous Unwind of two arrays from MongoDB

在 Spoon 中,我使用了 mongoDB 输入步骤。对于给定的表格文档..

{"Number": [
    "4700100004"
],
"Random": [
    "unknown"
],
"List_Of_Vals1": [
    "3",
    "2",
    "1",
],
"List_Of_Vals2": [
    "1",
    "2",
    "3",
]}

我能够使用来自 pdi

的 Mongo 查询展开其中一个数组
[{"$unwind":"$List_Of_Vals1"}]

产生::

Number       Random    List_Of_Vals1    List_Of_Vals2
"4700100004" "unknown" "3"              ["1","2","3"]
"4700100004" "unknown" "2"              ["1","2","3"]
"4700100004" "unknown" "1"              ["1","2","3"]

但最终我需要依次展开两个数组,我认为我可以通过编写

[{"$unwind":"$List_Of_Vals1"},{"$unwind":"$List_Of_Vals2"}]

但这returns是"List_Of_Vals1"

的重复
Number       Random    List_Of_Vals1    List_Of_Vals2
"4700100004" "unknown" "3"              "1"
"4700100004" "unknown" "3"              "2"
"4700100004" "unknown" "3"              "3"
...
...
...

我似乎无法弄清楚如何得到的是没有重复的展开:

Number       Random    List_Of_Vals1    List_Of_Vals2
"4700100004" "unknown" "3"              "1"
"4700100004" "unknown" "2"              "2"
"4700100004" "unknown" "1"              "3"

非常感谢任何帮助。 谢谢

您可以使用 Mongo 3.2 中引入的 $unwind 选项 includeArrayIndex 来实现此目的。对于每个由 $unwind 操作输出的文档,它添加一个新字段保存数组索引。

您可以在 $project$match 阶段使用这些字段将输出过滤到正确的文档子集,即索引匹配的文档。

db.test.aggregate([
  { $unwind: { path: "$List_Of_Vals1", includeArrayIndex : "index1" } },
  { $unwind: { path: "$List_Of_Vals2", includeArrayIndex : "index2" } },
  { $project: { 
         _id : 1,
         Number: 1,
         Random: 1,
         List_Of_Vals1: 1,
         List_Of_Vals2: 1,
         valid: { $eq: ["$index1", "$index2"] } }
   },
  { $match: { valid: true } } 
]);

请注意,展开 2 个大小为 n 的数组将产生 n x n 结果,因此如果两个数组都很大,您可能 运行 会遇到限制问题。

$zip operator 即将推出一项功能,应该可以提供更好的解决方案。