【问题标题】:Comparison query operator ObjectId <-> Date比较查询运算符 ObjectId <-> Date
【发布时间】:2017-06-26 20:25:00
【问题描述】:

是否可以对DateObjectId 执行比较查询$gt$lt 等,反之亦然? mongodb驱动程序会自动转换吗?这个 mongodb 服务器会自动转换吗?

【问题讨论】:

  • 你能在问题编辑中举个例子吗?

标签: javascript node.js mongodb mongodb-query


【解决方案1】:

是和不是。

在基于 JavaScript 的方法下,可以从 ObjectId 值中获取日期,您可以在其中进行比较。也应该可以构造一个给定特定日期值的 ObjectId,但看不到它的实用性。但是所有的日期都是有效的和基本的:

ObjectId("53473d87cb495e216c982929") > ObjectId("53473e57cb495e216c98292a")

ObjectId("53473d87cb495e216c982929").getTimestamp() >
ObjectId("53473e57cb495e216c98292a").getTimestamp()

ObjectId("53473d87cb495e216c982929").getTimestamp() >
ISODate("2014-04-11T00:55:35Z")    

所以这样的形式会起作用,即使声明真的不是那么好:

db.collection.find({ 
    "$where": function() {
         return this._id.getTimestamp() > new Date("2014-01-01");
    }
}

至于_id 的“创建”,它们要么在“驱动程序”中完成,要么由用户明确完成,或者如果仍然省略,服务器将生成一个。

【讨论】:

  • 所以我不能直接在查询对象中将Date 对象与ObjectId 对象进行比较,反之亦然?
  • @paulkon 添加了一个可能的用法示例来清除它。基于 JavaScript 的查询对于性能来说肯定不是好消息,所以你真的应该看看其他方法来避免这种情况。但这是可以做到的。
  • 我必须为此使用$where
  • @paulkon $where 调用一个 JavaScript 解释器来评估每个条件,mapReduce 也是如此。从 _id 获取时间戳的方法只有在 JavaScript 执行下服务器端可用。可悲的是,诸如聚合之类的方法还缺乏必要的数学和强制转换运算符,否则无法从 id 获取时间戳。否则这将是一个更好的方法。
猜你喜欢
  • 1970-01-01
  • 2015-03-01
  • 2021-06-10
  • 1970-01-01
  • 2014-06-14
  • 2016-10-02
  • 1970-01-01
相关资源
最近更新 更多