Изменить дату строки на дату ISO в MongoDB?

В 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, но это добавление нового поля в мой документ, я думаю, это из-за массива, я хочу обновить существующий.


person TB.M    schedule 23.01.2017    source источник


Ответы (2)


Вам просто нужно изменить свой код, чтобы он также зацикливался на массиве.

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

Вы можете использовать модуль dateutil (sudo pip install python-dateutil)

Ниже приведен пример кода, который преобразует строку ISO в объект времени данных, а затем вставляет ее в базу данных 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"
}

Аналогичным образом вы можете обновить даты строк в формате ISO в mongoDB.

person x899    schedule 23.01.2017
comment
без использования pymongo, как я могу это сделать? - person TB.M; 23.01.2017
comment
Вы должны обновляться непосредственно в MongoDB, верно? Тогда вам нужен какой-то интерфейс, который подключит ваш язык программирования к mongodb. В Python это pymongo (есть и другие, но поверьте мне, pymongo намного проще в освоении, чем другие). - person x899; 23.01.2017
comment
Я использовал этот скрипт; но это создает новые поля в документе, которые также из массива... не обновляются... db.dummy.find().forEach(function(doc) { doc.mongodbdate=new Date(data.mongodbdate); db.dummy.save(doc);}) - person TB.M; 23.01.2017
comment
Это всего лишь пример кода для демонстрации решения. Вам нужно использовать команду update для обновления документа. Пожалуйста, прочитайте о mongodb и pymongo. - person x899; 23.01.2017
comment
если я также обновляю ... это создает новый вне массива ... он не обновляет создание нового. - person TB.M; 24.01.2017
comment
вы в порядке с реализацией python в pymongo? - person x899; 24.01.2017
comment
нет, я не хочу реализовывать pymongo. Я хочу запустить это только с помощью java-скрипта, который я могу запустить, как я упоминаю в своем вопросе. - person TB.M; 25.01.2017
comment
Дай мне немного времени. Я обновлю ответ реализацией Javascript. - person x899; 25.01.2017
comment
у вас есть какое-нибудь решение? - person TB.M; 25.01.2017