在插入时自动填充MongoDB中的日期

时间:2016-06-13 05:15:45

标签: mongodb

MongoDB提供了一种在系统更新操作时更新日期字段的方法:https://docs.mongodb.com/manual/reference/operator/update/currentDate/。插入操作是否有相同的功能?

4 个答案:

答案 0 :(得分:6)

如果你不想从代码处理这个问题,我可能会尝试做一些事情(我已经直接在mongo shell上执行了下面的代码):

  1. 如果你想使用$ currentDate,请使用upsert = true:

    db.orders.update(
       {"_id":ObjectId()},
       {
           $currentDate: {
             createtime: true
           }
       },
       { upsert: true }
    )
    
  2. 现在它将在app服务器上生成objectid而不是日期/时间(除非你使用raw命令)。

    1. 直接使用新的时间戳或日期对象:

      db.orders.insert(
          "createtime": new Timestamp()
      )
      
    2. 大多数驱动程序的问题是确保在mondodb服务器上创建新对象 - 而不是在运行代码的机器上创建。希望你的驱动程序允许运行raw insert命令。

      两者都将用于避免应用程序服务器计算机之间的时间差异/时间同步问题。

答案 1 :(得分:1)

$currentDate是一个更新运算符,它通过更新操作使用当前日期填充日期字段。

要在插入新的MongoDB文档时自动填充日期字段,请尝试执行以下代码段

var current_date=new Date();
db.collection.insert({datefield:current_date})

在上面的代码片段中声明

  

新日期()

创建一个新的 JavaScript 日期对象,其中包含一年,一个月,一天,一小时,一分钟,一秒和几毫秒

答案 2 :(得分:0)

如果要在服务器端运行该值时填充此值,并且担心它会被客户端传递,则可以仅在将插入值添加到数据库中时才向插入语句中使用的数据对象添加属性。已保存。这样,您可以保证每次添加服务器日期而不是客户端日期的,而不是客户端的日期:

客户端

...
let data = { info1: 'value1', info2: 'value2'}
someApi.addInfo(data);
...

服务器端

function addInfo(data){
    ...
    data['creationDate'] = new Date();
    db.collection.insertOne(data);
    ...
}

结果将是:

{
    info1: 'value1', 
    info2: 'value2',
    creationDate: ISODate("2018-09-15T21:42:13.815Z")
}

如果要传递多个插入值(使用insertMany),则必须遍历所有项目并为所有项目添加此属性。

如果由于某种原因无法使用$currentDate运算符,只要确保您不替换传递的数据中的任何现有属性,就可以在更新文档时使用此方法。到mongodb

答案 3 :(得分:0)

从mongo 3.6开始,您可以使用“更改流”: https://emptysqua.re/blog/driver-features-for-mongodb-3-6/#change-streams

要使用它,您需要通过“观看”查询创建一个变更流对象:

def update_ts_by(change):
    update_fields = change["updateDescription"]["updatedFields"].keys()
    print("update_fields: {}".format(update_fields))

    collection = change["ns"]["coll"]
    db = change["ns"]["db"]
    key = change["documentKey"]

    if len(update_fields) == 1 and "update_ts" in update_fields:
        pass
    else:
        client[db][collection].update(key, {"$set": {"update_ts": datetime.now()}})


client = MongoClient("172.17.0.2")
db = client["Data"]

change_stream = db.watch()

for change in change_stream:
    print(change)
    update_ts_by(change)

注意,要使用change_stream对象,您的mongodb实例应以“副本集”运行。 也可以将其作为1节点副本集来完成(几乎没有变化,只有独立使用): Mongo DB - difference between standalone & 1-node replica set