Mongo查找四舍五入日期

时间:2020-03-19 16:01:37

标签: mongodb aggregation-framework

我是使用"workbench.view.debug"的初学者。我必须将一个或多个文档嵌入到另一个文档中,其中用于查找的键是Mongo,应向下舍入到第二个。我怎样才能达到这个结果?

如果我应该对多个键执行查询,比如说ISODateDtEvent,怎么办?

这是一个示例数据集:

WorkstationId集合:

temperature

{ "WorkstationId" : 1, "DtEvent" : ISODate("2020-01-01T00:00:10.723Z"), "ParameterName" : "temperature", "ParameterValue" : 232.1 } { "WorkstationId" : 1, "DtEvent" : ISODate("2020-01-01T00:00:56.622Z"), "ParameterName" : "temperature", "ParameterValue" : 231.9 } 集合:

pressure

我尝试执行以下操作:

{
    "WorkstationId" : 1,
    "DtEvent" : ISODate("2020-01-01T00:00:10.725Z"),
    "ParameterName" : "pressure",
    "ParameterValue" : 3276.69
}
{
    "WorkstationId" : 1,
    "DtEvent" : ISODate("2020-01-01T00:00:56.641Z"),
    "ParameterName" : "pressure",
    "ParameterValue" : 3276.69
}
{
    "WorkstationId" : 1,
    "DtEvent" : ISODate("2020-01-01T00:01:42.622Z"),
    "ParameterName" : "pressure",
    "ParameterValue" : 3276.69
}

但是,正如预期的那样,由于密钥不完全匹配,因此未嵌入文档:

db.pressure.aggregate([{    
    $lookup: {
        from: "temperature",
        localField: "DtEvent",
        foreignField: "DtEvent",
        as: "temperature"        
    }
}])

1 个答案:

答案 0 :(得分:1)

经典$lookup期望完全匹配。由于您的Dates不是精确值,因此您需要运行uncorrelated sub-query

db.pressure.aggregate([
  {
    $lookup: {
      from: "temperature",
      let: {
        dt_event: {
          $dateToString: {
            date: "$DtEvent",
            format: "%Y-%m-%dT%H:%M:%S"
          }
        }
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$$dt_event",
                {
                  $dateToString: {
                    date: "$DtEvent",
                    format: "%Y-%m-%dT%H:%M:%S"
                  }
                }
              ]
            }
          }
        }
      ],
      as: "temperature"
    }
  }
])

MongoPlayground

注意:MongoDB不会使用索引,因此对于大型集合而言性能会很差