【问题标题】:Change String date to ISO date in MongoDB?在 MongoDB 中将字符串日期更改为 ISO 日期?
【发布时间】:2017-06-07 15:19:18
【问题描述】:

在 MongoDB 中,我有一个文档,其中包含一个名为“日期”的字段,并且位于数组中。

  {
"_id" : ObjectId("587627a2125a730f78a20859"),
"data" : [
    {
        "Number" : "359983007479839",
        "date" : "2016-02-10T21:56:33.000Z"
    }
] 

之后我运行这个脚本:

db.dummy.find().forEach(function(doc){
doc.mongodbdate = ISODate(doc.mongodbdate);
db.dummy.save(doc);
})

它给了我下面的输出;

{
"_id" : ObjectId("588724ba2746360c04a51e4b"),
"data" : [
    {
        "Number" : "359983007479839",
        "mongodbdate" : "2016-02-12T18:01:06.000Z"
    }
],
"mongodbdate" : ISODate("2017-01-24T15:26:24.537+05:30")
}

我也试过这个:

var bulk = db.dummy.initializeUnorderedBulkOp(),
count = 0;

db.dummy.find().forEach(function(doc) {
bulk.find({ "_id": doc._id }).updateOne({
    "$set": { "mongodbdate": ISODate(doc.mongodbdate) }
})
count++;
if (count % 1000 == 0) {
    // Execute per 1000 operations and re-init
    bulk.execute();
    bulk = db.dummy.initializeUnorderedBulkOp();
}
})

它抛出错误: “消息”:“无效的 ISO 日期”

我想将该字符串日期转换为 ISO 日期。我已经更改了一些代码,但它添加了 ISO 格式的新日期,但我想更新已经可用的日期,无需插入新日期。 我也在 stackoverflow 上得到了一个解决方案,但那是在我的文档中添加新字段,我认为这是因为数组,我想更新我现有的。

【问题讨论】:

    标签: mongodb date isodate


    【解决方案1】:

    你只需要修改你的代码来循环数组。

    db.dummy.find().forEach(function (doc) {
      doc.data.forEach(function (currentValue, index) {
        doc.data[index].mongodbdate = ISODate(currentValue.mongodbdate);
      });
      db.dummy.save(doc);
    })
    

    【讨论】:

      【解决方案2】:

      你可以使用 dateutil 模块(sudo pip install python-dateutil)

      以下是将 ISO 字符串转换为 datatime 对象,然后将其插入 mongo 数据库的示例代码。

      import datetime
      import pymongo
      import dateutil.parser
      
      def getDatetimeFromISO(s):
          d = dateutil.parser.parse(s)
          return d
      
      conn = pymongo.MongoClient()
      db = conn.sampleDB
      collection = db.test
      post = {
          "user" : "test1",
          "date" : getDatetimeFromISO("2016-02-10T21:56:33.000Z")
      }
      
      collection.insert_one(post)
      conn.close()
      

      在 MongoDB 中

      > db.test.find().pretty()
      {
          "_id" : ObjectId("5885b47156addb199a07bf26"),
          "date" : ISODate("2016-02-10T21:56:33Z"),
          "user" : "test1"
      }
      

      您可以在 mongoDB 中以类似的方式将字符串日期更新为 ISO 格式。

      【讨论】:

      • 不使用pymongo怎么办?
      • 你必须直接在 MongoDB 中更新,对吧?然后你需要一些接口将你的编程语言连接到 mongodb。在 Python 中,恰好是 pymongo(还有其他人,但相信我,pymongo 比其他人容易学习)。
      • 我用过这个脚本;但这是在文档中创建的新字段也超出了数组...它没有更新... db.dummy.find().forEach(function(doc) { doc.mongodbdate=new Date(data.mongodbdate); db.dummy.save(doc); })
      • 这只是一个示例代码来演示解决方案。您需要使用update 命令来更新文档。请阅读有关 mongodb 和 pymongo 的信息。
      • 如果我也在更新..那是在数组之外创建一个新的......它不会更新它创建新的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多