MongoDB相当于NOW() + INTERVAL的功能。

3

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

在MySQL中,我们经常使用以下类似的内容:

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

我该如何在MongoDB中完成这个任务?我需要使用2个查询吗?第一个查询用$currentDate来设置completion_time,第二个查询用$inc来增加它吗?我已经阅读了MongoDB中$inc无法对日期进行操作的内容...

请问如何在Python中检查一个字符串是否是数字?我有一个字符串,我想知道它是否可以转换为数字。我该怎么做? - Salvador Dali
那并没有真正帮助。他们要么使用字符串或$currentDate。我需要同时向currentDate添加一些内容。此外,首先在PHP中创建日期是一个不好的主意,因为您无法保证所有PHP服务器具有完全相同的日期。 - DeXter
@DeXter:我猜你使用了一个日期字段来存储这个值? - Markus W Mahlberg
@DeXter 你在数据库和应用程序之间使用了两个不同的时区吗?也许数据库也可以有多个时区? - Sammaye
你不能在服务端使用 $currentDate 带有偏移量来设置时间,但是你可以在客户端通过给当前时间加上一个偏移量来生成时间戳并将该日期时间值发送到服务器进行存储。我不会为此编写代码,因为我不熟悉 PHP。 - wdberkeley
5个回答

2

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

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

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))])

看起来这是唯一的方法。


0
从MongoDB v5.0+开始,您可以使用$dateAdd$$NOW
db.collection.update({
  _id: 1
},
[
  {
    $set: {
      completion_time: {
        "$dateAdd": {
          "startDate": "$$NOW",
          "unit": "minute",
          "amount": 90
        }
      }
    }
  }
])

这里是您参考的Mongo Playground


-1

使用

db.collection.UpdateOne({ _id:id},{
     $set:{
      "completion_time": $add:[ $currentDate , (60*90)]
      }
})

这看起来很像Diwakar upadhyay 2015年的回答:如果没有至少一个版本可以证明它的可行性,为什么它会表现更好呢? - greybeard

-2

请尝试这个,绝对有效。

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

1
那个是用来做什么的?$date 是从哪里来的(MongoDB 目前唯一的日期规范字段是 http://docs.mongodb.org/manual/reference/operator/update/currentDate/)?另外,你确定 $add 可以在更新语句中使用吗? - Sammaye
你测试过这段代码吗?这会导致一个 未捕获的异常:字段名称不能以$ [$add]开头 的错误。 - chridam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接