【发布时间】:2019-09-08 05:14:07
【问题描述】:
我正在使用 MongoDB 聚合管道尝试查看是否可以使用它来解析具有以下格式的文件。
FIELD1:ABC
FIELD2:DEF
...
FIELD12:YZ
RowData:__ __ 01 __ __
RowData:__ 02 01 01 __
RowData:__ __ 03 __ __
我已将文件流直接插入到一个名为 fileStream 的 mongo 文档中。现在我正在尝试创建一个管道来将每个字段添加到文档中。我已经取得了一些成功,但我似乎无法将具有重复值的键放入数组中。
我遇到的问题是任何重复的键都会被最后一个值覆盖。
通过这条管道,我得到一个数组数组,其中元素 0 是键,元素 1 是值。因此,当我使用 $arrayToObject 时,仅保留最后一个字段用于重复键。
db.maps.aggregate([
{
$addFields: {
'rows':
{
$map:
{
input: {
// Sinf Rows
$filter: {
input: { $split: ['$fileStream', '\r\n'] },
as: 'row',
cond: { $ne: ['$$row', ''] }
}
},
as: 'row',
in:
{
$split: ['$$row', ':']
}
}
}
}
}
]).pretty()
此管道已关闭,但 RowData 元素未包含在数组中。
db.maps.aggregate([
{
$addFields: {
'rows':
{
$map:
{
input: {
// Sinf Rows
$filter: {
input: { $split: ['$fileStream', '\r\n'] },
as: 'row',
cond: { $ne: ['$$row', ''] }
}
},
as: 'row',
in:
{
$cond: [{ $eq: [{ $arrayElemAt: [{ $split: ['$$row', ':'] }, 0] }, 'RowData'] }, { $arrayElemAt: [{ $split: ['$$row', ':'] }, 1] }, { $split: ['$$row', ':'] }]
}
}
}
}
}
]).pretty()
我想将所有重复的键合并到同一个数组中。
像这样的
"file":
{
"FIELD1": "ABC"
...
"RowData":
[
"__ __ 01 __ __",
"__ 02 01 01 __",
"__ __ 03 __ __"
]
}
我可以在 js 中使用 reduce 来做到这一点,但是如何使用聚合 $reduce 将其累积到数组或对象中?
【问题讨论】:
标签: mongodb aggregation-framework