【问题标题】:Select based on timestamp and update timestamp with zero根据时间戳选择并用零更新时间戳
【发布时间】:2023-04-02 07:35:01
【问题描述】:

如何从 MongoDB 集合中的时间 (HH:MM:SS.Milisecond) 值大于零的日期字段中选择记录,并将其更新为时间 (HH:MM:SS) 值为零保持日期值与 Python 脚本中的现有值相同?

当前数据如下所示 -

1) "createdDate" : ISODate("2015-10-10T00:00:00Z")
2) "createdDate" : ISODate("2015-10-11T00:00:00Z")
3) "createdDate" : ISODate("2015-10-12T00:00:00Z")
4) "createdDate" : ISODate("2015-10-13T01:04:30.515Z")
5) "createdDate" : ISODate("2015-10-14T02:05:50.516Z")
6) "createdDate" : ISODate("2015-10-15T03:06:60.517Z")
7) "createdDate" : ISODate("2015-10-16T04:07:80.518Z")

如何使用mongodbsql 仅选择第 4、5、6 和 7 行并在 Python 脚本中将其更新为时间戳为零?

更新后的数据如下-

1) "createdDate" : ISODate("2015-10-10T00:00:00Z")
2) "createdDate" : ISODate("2015-10-11T00:00:00Z")
3) "createdDate" : ISODate("2015-10-12T00:00:00Z")
4) "createdDate" : ISODate("2015-10-13T00:00:00Z")
5) "createdDate" : ISODate("2015-10-14T00:00:00Z")
6) "createdDate" : ISODate("2015-10-15T00:00:00Z")
7) "createdDate" : ISODate("2015-10-16T00:00:00Z")

【问题讨论】:

    标签: python mongodb datetime mongodb-query pymongo


    【解决方案1】:

    ISODate() 被 PyMongo 表示为 datetime 对象。 MongoDB 假定日期和时间采用 UTC。对于给定的 UTC 时间d,有几种方法可以获得午夜(一天的开始):

    >>> from datetime import datetime, time, timedelta
    >>> d = datetime(2015, 10, 13, 1, 4, 30, 515000)
    >>> datetime(d.year, d.month, d.day) # @user3100115' answer
    datetime.datetime(2015, 10, 13, 0, 0)   # 369 ns
    >>> datetime.fromordinal(d.toordinal()) # 451 ns
    datetime.datetime(2015, 10, 13, 0, 0)
    >>> datetime.combine(d, time.min)       # 609 ns
    datetime.datetime(2015, 10, 13, 0, 0)
    >>> d - (d - d.min) % timedelta(days=1) # Python 3
    datetime.datetime(2015, 10, 13, 0, 0)   # 1.87 µs
    >>> datetime(*d.timetuple()[:3])
    datetime.datetime(2015, 10, 13, 0, 0)   # 2.34 µs
    >>> from calendar import timegm
    >>> datetime.utcfromtimestamp((timegm(d.timetuple()) // 86400) * 86400) # POSIX
    datetime.datetime(2015, 10, 13, 0, 0)   # 4.72 µs
    

    【讨论】:

      【解决方案2】:

      更新你的文档和set00:00:00的最好方法是使用datetime模块,因为createdDate在Python中是一个datetime object,所以你可以使用datetime实例属性dayyearmonth

      from datetime import datetime
      
      from pymongo import MongoClient
      
      client = MongoClient()
      db = client.test
      collection = db.collection
      bulkOp = collection.initialize_ordered_bulk_op()
      count = 0
      for doc in collection.find():
          year = doc['createdDate'].year
          month = doc['createdDate'].month
          day = doc['createdDate'].day
          new_date = datetime(year, month, day)
          bulkOp.find({'_id': doc['_id']}).update({'$set': {'createdDate': new_date}})
          count = count + 1
          if count == 125:
              bulkOp.execute()
              bulkOp = collection.initialize_ordered_bulk_op()
      
      if count % 125 != 0:
         bulkOp.execute()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多