【问题标题】:Timestamp operations in MongoDB when some timestamps are null当某些时间戳为空时,MongoDB 中的时间戳操作
【发布时间】:2018-03-27 16:59:03
【问题描述】:

我有一个包含时间戳字段 (TIMESTAMPVALUE) 的集合,我想对其进行投影,以便仅从时间戳中提取小时。问题是某些时间戳为空。查询是:

db.collections.aggregate([
  { 
    $project : {
      hour: {$hour: "$TIMESTAMPVALUE"},
      (...some other projections...)
    }
  }
])

当我运行这个时,我得到一个错误:

{ "serverUsed" : "localhost:27017" , "ok" : 0.0 , "errmsg" : "无法从 BSON 类型 null 转换为 Date" , "code" : 16006 , "codeName" : "Location16006" }

有没有一种简单的方法来更改此聚合,以便我在结果的hour 字段中得到空值,正如人们合理预期的那样,而不是使整个查询失败,最好是比将其拆分为两个管道更简单的方法,一个处理空值,另一个处理非空值,然后加入结果?我正在使用 MongoDB 3.4。

【问题讨论】:

  • 我正在考虑它,但我不确定这是否会有所帮助 - $ifNull 不能用作三元运算符,我需要类似于 timestamp==null ? null : hour(timestamp) 但 MongoDB 的 @987654326 @ 只能用不同的值替换空值,所以我只能将空时间戳转换为非空时间戳,但这不是我需要的。 $ifNotNull 实际上会有所帮助,但似乎没有这样的事情:)

标签: mongodb


【解决方案1】:

知道了。解决办法是:

db.collection.aggregate([                                                                                                                                                                                          
  {
    $project : {
      hour: { $cond:
        [ { $eq: [ "$TIMESTAMPVALUE", null ] }, null, { $hour: "$TIMESTAMPVALUE" } ]
      }
    }
  }
])

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 2013-04-17
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多