MongoDB相当于NOW()+ INTERVAL

时间:2015-03-23 09:44:00

标签: mysql mongodb mongodb-query mongodb-php

我目前正在努力将我们的PHP后端从MySQL转换为MongoDB。

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

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

我如何在MongoDB中执行此操作?我需要使用2个查询吗?首先使用$ currentDate设置completion_time,然后使用第二个查询来增加它?我已经读过$ inc不适用于MongoDB中的日期,... ...

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

请一定尝试这个,

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

答案 2 :(得分:0)

我发现你已经用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))])

这似乎是唯一的方法。