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 即将推出一项功能,应该可以提供更好的解决方案。
在 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 即将推出一项功能,应该可以提供更好的解决方案。