在我的聚合管道中,我可以得到以下中间文档:
{ date: "01-01-2018", value: 1 }
{ date: "04-01-2018", value: 2 }
{ date: "07-01-2018", value: 3 }
根据我拥有的数据,我可能会得到(如上所示)丢失的数据点
我的聚合管道中有没有办法为缺失的日子提供一些默认文档(或空值等默认值)?
这样我就会得到:
{ date: "01-01-2018", value: 1 }
{ date: "02-01-2018", value: null }
{ date: "03-01-2018", value: null }
{ date: "04-01-2018", value: 2 }
{ date: "05-01-2018", value: null }
{ date: "06-01-2018", value: null }
{ date: "07-01-2018", value: 3 }
也许 $addToSet 运算符,但我如何添加这些人工文档?
填补业务逻辑空白是唯一的方法吗?
最佳答案
从 Mongo 5.1
开始,它是新 $densify
的完美用例聚合运算符:
// { date: ISODate("2018-01-01"), value: 1 }
// { date: ISODate("2018-01-04"), value: 2 }
// { date: ISODate("2018-01-07"), value: 3 }
db.test.aggregate([
{ $densify: {
field: "date",
range: { step: 1, unit: "day", bounds: "full" }
}}
])
// { date: ISODate("2018-01-01"), value: 1 }
// { date: ISODate("2018-01-02") }
// { date: ISODate("2018-01-03") }
// { date: ISODate("2018-01-04"), value: 2 }
// { date: ISODate("2018-01-05") }
// { date: ISODate("2018-01-06") }
// { date: ISODate("2018-01-07"), value: 3 }
这会通过在文档序列中创建新文档来致密文档 ( $densify
),其中 字段
具有特定值(在我们的示例中 字段:“日期”
)缺少:
- 我们的致密化步骤是 1 天:
范围:{ 步骤:1,单位:“天”,... }
- 我们会在文档定义的日期范围内进行加密:
bounds: "full"
当然,为了使其适用于您的特定示例,您可以使用 $dateToString
从日期切换到字符串。并返回日期 $dateFromString
.
关于MongoDB 填充缺失结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52538672/