MongoDB 相当于 NOW() + INTERVAL

Posted

技术标签:

【中文标题】MongoDB 相当于 NOW() + INTERVAL【英文标题】:MongoDB equivalent to NOW() + INTERVAL 【发布时间】:2015-05-26 06:08:56 【问题描述】:

我目前正在将我们的 php 后端从 mysql 转换为 MongoDB。

我们经常在 MySQL 中使用这样的东西:

UPDATE table_1 SET completion_time = NOW() + INTERVAL 90 MINUTE WHERE id = 1;

我将如何在 MongoDB 中执行此操作?我需要使用 2 个查询吗?使用 $currentDate 设置完成时间的第一个查询和增加它的第二个查询?我已经读到 $inc 不适用于 MongoDB 中的日期,但是 ...

【问题讨论】:

不是重复的,而是类似的:***.com/q/7675549/1090562 这并没有真正的帮助。它们要么使用字符串,要么使用 $currentDate。我需要同时向 currentDate 添加一些内容。同样首先在 PHP 中创建日期是一个坏主意,因为您不能保证所有 php 服务器都具有完全相同的日期。 @DeXter:我假设您使用日期字段来存储值? @DeXter 您是否在数据库和应用程序之间使用了两个不同的时区,也许数据库也可以在多个时区中? 您不能使用带有偏移量的$currentDate 来设置服务器端的时间,但您可以使用 now + 偏移量客户端为文档添加时间戳并将该日期时间值发送到存储在服务器。我不会尝试为它编写代码,因为我不熟悉 PHP。 【参考方案1】:

您可以尝试创建一个包含当前日期 + 90 分钟后的日期变量,然后您可以使用它在更新中设置 completion_time 字段:

var ninetyMinutesLater = new Date();
ninetyMinutesLater.setMinutes(ninetyMinutesLater.getMinutes() + 90);
db.table_1.update(
    "_id": 1 ,
        
     "$set": 
        "completion_time": ninetyMinutesLater 
     
       
);

【讨论】:

【参考方案2】:

我看到你已经用mongodb-php 标记了这个,所以我假设你使用的是 PHP。 MongoDB 确实有 $currentDate 运算符,但目前无法实际设置该日期的偏移量。

例如,我在 3.0 上尝试了@diwakar 的回答:

> db.table_1.update("id":1 ,completion_time:  $add: [ "$currentDate", 90 ] )
2015-03-23T11:22:05.497+0000 E QUERY    Error: field names cannot start with $ [$add]
    at Error (<anonymous>)
    at DBCollection._validateForStorage (src/mongo/shell/collection.js:160:19)
    at DBCollection._validateForStorage (src/mongo/shell/collection.js:164:18)
    at DBCollection._validateUpdateDoc (src/mongo/shell/collection.js:387:14)
    at Object.findOperations.updateOne (src/mongo/shell/bulk_api.js:675:20)
    at DBCollection.update (src/mongo/shell/collection.js:454:22)
    at (shell):1:12 at src/mongo/shell/collection.js:160

所以目前这需要像这样在客户端完成:

$mongo->collection->insert(['completion_time' => new MongoDate(time() + (60*90))])

看来这是唯一的办法了。

【讨论】:

【参考方案3】:

请试试这个绝对有效,

db.table_1.update("id":1 ,completion_time:  $add: [ "$date", 90 ] )

【讨论】:

那应该怎么做? $date 来自哪里(MongoDB 目前唯一的日期规范字段是 docs.mongodb.org/manual/reference/operator/update/currentDate )?另外你确定$add 真的可以用在更新语句中吗? 你测试过这段代码吗?这会导致出现uncaught exception: field names cannot start with $ [$add] 错误。

以上是关于MongoDB 相当于 NOW() + INTERVAL的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB now with Transaction support

哪个数据库适合我的应用程序 mysql 或 mongodb ?使用 Node.js 、 Backbone 、 Now.js

是否按时间字段(其中 auto_now_add=True)对表进行排序,相当于按所述表的主键 ID 对表进行排序?

set集合

已解决com.mongodb.MongoSocketOpenException: Exception opening socket

如何在列中划分句点