MongoDB 填充缺失结果

标签 mongodb aggregation-framework

在我的聚合管道中,我可以得到以下中间文档:

{ 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/

相关文章:

mongodb - 对于以 "userAdminAnyDatabase"角色创建的用户,无法访问其他数据库

java - 无法在多文档事务中创建命名空间(MongoDB 4.0、Spring Data 2.1.0、Spring Boot)

javascript - Mongoose - 如何分组和填充?

node.js - mongodb 中填充的替代方案?

javascript对象数组没有改变

javascript - 嵌套查询 mongoose .find

javascript - 使用 $lookup 在 mongodb 中进行外部连接

javascript - 更新另一个集合中的匹配记录?

mongodb - 通过 mongodb 中的聚合和 $facet 在每个文档中添加一个新字段

node.js - Raspberry Pi : MongoError: Server at localhost:27017 reports wire version 0, 但此版本的 Node.js 驱动至少需要 2 个 (MongoDB2.6)