我有一个收集,我在那里储存特定一天分配的水.现在有几天,当设备不运行时,数据不会存储在数据库中,我也不会从收集中获取数据.例如,我查询过go 7天的配水情况,设备只运行了两天,结果如下:

[{ 
    "uID" : "12345678", 
    "midNightTimeStamp" : NumberInt(1645381800), 
    "waterDispensed" : NumberInt(53)
},
{ 
    "uID" : "12345678", 
    "midNightTimeStamp" : NumberInt(1645641000), 
    "waterDispensed" : NumberInt(30)
}]

将上述两个时间戳转换为2月21日星期一和2月24日星期四的数据.现在如果我运行2月21日到2月27日这样的查询,

db.getCollection("analytics").find({ uID: "12345678", midNightTimeStamp: {"$in": [1645381800, 1645468200, 1645554600, 1645641000, 1645727400, 1645813800, 1645900200]}})

这只返回了以上两个文档,如何为MiddNightTimestamp填充缺少的值,以获得这样的文档列表,但它不存在:

[{ 
    "uID" : "12345678", 
    "midNightTimeStamp" : 1645381800, 
    "waterDispensed" : 53
},
{ 
    "uID" : "12345678", 
    "midNightTimeStamp" : 1645468200, 
    "waterDispensed" : 0
},
{ 
    "uID" : "12345678", 
    "midNightTimeStamp" : 1645554600, 
    "waterDispensed" : 0
},
{ 
    "uID" : "12345678", 
    "midNightTimeStamp" : 1645641000, 
    "waterDispensed" : 30
},
{ 
    "uID" : "12345678", 
    "midNightTimeStamp" : 1645727400, 
    "waterDispensed" : 0
},
{ 
    "uID" : "12345678", 
    "midNightTimeStamp" : 1645813800, 
    "waterDispensed" : 0
},
{
    "uID" : "12345678", 
    "midNightTimeStamp" : 1645900200, 
    "waterDispensed" : 0
}

推荐答案

也许是这样的:

db.collection.aggregate([
{
 $group: {
   _id: null,
   ar: {
    $push: "$$ROOT"
   },
   mind: {
    "$min": "$midNightTimeStamp"
   },
   maxd: {
    "$max": "$midNightTimeStamp"
   }
  }
 },
 {
  $project: {
  ar: {
    $map: {
      input: {
        $range: [
          "$mind",
          {
            "$sum": [
              "$maxd",
              86400
            ]
          },
          86400
        ]
      },
      as: "dateInRange",
      in: {
        $let: {
          vars: {
            dateIndex: {
              "$indexOfArray": [
                "$ar.midNightTimeStamp",
                "$$dateInRange"
              ]
            }
          },
          in: {
            $cond: {
              if: {
                $ne: [
                  "$$dateIndex",
                  -1
                ]
              },
              then: {
                $arrayElemAt: [
                  "$ar",
                  "$$dateIndex"
                ]
              },
              else: {
                midNightTimeStamp: "$$dateInRange",
                "waterDispensed": NumberInt(0)
              }
            }
          }
        }
       }
      }
     }
    }
  },
  {
   $unwind: "$ar"
  },
  {
   $project: {
    _id: 0,
    "waterDispensed": "$ar.waterDispensed",
    midNightTimeStamp: "$ar.midNightTimeStamp",
    "Date": {
      $toDate: {
         "$multiply": [
         "$ar.midNightTimeStamp",
         1000
       ]
      }
    }
   }
  }
])

解释:

  1. $将文档分组以查找max&;时间戳的最小值和$push名为"ar"的临时数组中的所有元素
  2. $project数组$mapping,其中包含一个在max&;最小值为1x天步长(86400),用waterDispanced:0填充空元素
  3. $展开数组$ar
  4. $project仅用于最终输出中所需的字段.

playground

Node.js相关问答推荐

使用NodeJS在S3上传文件时的格式问题

使用HTTPS从NodeJS 17.9.1升级到18.0.0后,SignalR连接失败

如何在Firebase Cloud Function v2计划函数中设置代码中的时区?

关于Node.js中的AES加密库的问题

在 NodeJS 中使用 post 时出现错误 500TypeError: 无法解构 'req.body' 的属性 'name',因为它未定义

在 azure blob 容器之间复制文件

在全局对象上声明的函数

我如何保护nodejs中的路由

node_modules/preact/src/jsx.d.ts:2145:22 - 错误 TS2304:找不到名称SVGSetElement

如何解决这个关于 TaskRunner 的 Node/Express 代码问题?

为什么我的 npm 脚本中的 glob 不起作用?

'{ id: string; 类型的参数}' 不可分配给FindOneOptions类型的参数

AWS EC2 npm install 突然很慢

即使部署成功,也不会触发 Firebase 函数来填充 Firestore 集合.为什么?

Cassandra node.js 驱动程序有替代品吗?

node_modules 中 .bin 文件夹的用途是什么?

Node.js, require.main === 模块

Node.js 与 .net 中的异步/等待

如何在express 中设置默认路径(路由前缀)?

如何设置 useMongoClient (Mongoose 4.11.0)?