【问题标题】:How to convert and over write MongoDB date string into ISODate using Python PyMongo?如何使用 Python PyMongo 将 MongoDB 日期字符串转换和重写为 ISODate?
【发布时间】:2017-12-08 16:40:21
【问题描述】:

我正在尝试将一些格式为“YYYY-MM-DD”的文档字符串转换为 MongoDB 中的 ISODates,并已成功为控制台编写了此代码,并获得了预期的效果:

db.address.find({ "date" : { $type : 2 } } ).forEach(function(element){  element.date = ISODate(element.date); db.address.save(element);})

我正在尝试在 Python 中做同样的事情:

client = MongoClient(my_mongodb_ip)
db = client.address
result = db.address.find( { "date" : { "$type" : 2 } } );
for r in result:
    print(r['date'])
    r["date"] = datetime.strptime(r["date"], "%Y-%m-%d")
    print(r['date'])
    db.address.update_one({"company": r['company']},
         {"$set": {"date" : r['date']}})

我想提供这个:

"date": {
  "$date": "2017-06-28T00:00:00.000Z"
},

我没有得到数据库的任何更新。

【问题讨论】:

    标签: python mongodb datetime pymongo


    【解决方案1】:

    尝试使用:

    import dateutil.parser
    
    dateutil.parser.parse(<your time String>)
    

    【讨论】:

      【解决方案2】:

      您可以使用 python 中的 arrow 模块来实现此目标。您只需创建一个小函数,可以将您的日期作为参数并将其转换为 ISO 格式。

      你可以这样做:

      import arrow
      
      def convert_to_ISO_Format(self, value):
          date                          = arrow.get(value)
          date                          = date.format("YYYY-MM-DDTHH:mm:ss")
          date                          = date  + "Z"
          self.converted_date_iso = date
      

      或者,如果您知道该州的区域并且想要相应地转换它,那么您可以这样做;

          def convert_to_ISO_Region(self,value):
              date                      = arrow.get(value)
              date                      = date.to("Asia/Singapore")
              date                      = date.format("YYYY-MM-DD HH:mm:ss")
              date                      = date  + "Z"
              self.converted_date_iso = date
      
                       OR
      

      如果要将当前日期和时间转换为 ISO,很简单,就像下面的一条语句。

      arrow.utcnow().datetime
      

      我希望这对您的问题有所帮助。

      【讨论】:

      • 这并没有达到我的需要,我最终将字符串更新为看起来像日期格式,但它实际上不是日期格式,它仍然是一个字符串。我需要了解如何更新 MongoDB。
      • 如果可能的话,您能否解释一下您的最后一句话,“我需要了解如何更新 MongoDB”,以便我可以帮助您!!
      • 您的代码创建了一个字符串,而不是日期时间对象,因此在更新 Mongo 时我没有项目类型 9,它仍然是 2,这意味着它不能用于日期函数。
      【解决方案3】:

      我知道这里出了什么问题。无需导入箭头或解析器,日期时间就可以了:

      newest_date = datetime.strptime(r["date"], "%Y-%m-%d")
      

      这会从我的集合中的“日期”项创建新的日期时间对象,假设格式为 YYYY-MM-DD。一旦我发现我也错误地将 .isoformat() 放在了这个再次创建字符串的末尾,不知道我为什么这样做。

      删除了不正确的 isoformat() 后,我现在可以运行了:

      db.address.update_one({"address": "1234", {"$set": {"date" : newest_date}})
      

      地址将正确更新为类型 9,即日期对象而不是字符串。我检查了这个:

      db.address.find({ "date" : { $type : 9 } } )
      

      【讨论】:

      • 是的,我是个十足的笨蛋!
      猜你喜欢
      • 2017-06-19
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      相关资源
      最近更新 更多