2017-01-23 7 views
1

В MongoDB у меня есть документ с полем «дата», который находится в массиве.Изменить дату строки на дату ISO в 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(); 
} 
}) 

its throws Error: "message" : "invalid ISO date"

Я хочу, чтобы преобразовать эту дату строку в ISO date.I изменились с некоторым кодом, но его добавление новой даты в формате ISO, но я хочу для обновления, который уже доступен, не нужно вставлять новый. Одно решение, которое я получил и от stackoverflow, но это добавление нового поля в мой документ, я думаю, что это из-за массива, я хочу обновить существующий.

ответ

0

Вы можете использовать dateutil модуль (Судо пункт установить питона-dateutil)

Ниже приведен пример кода, который преобразует строку ISO в datatime объект, а затем вставьте его в базу данных Монго.

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 в аналогичной манере.

+0

без использования pymongo, как я могу это сделать? –

+0

Вы должны обновить в MongoDB напрямую, не так ли? Затем вам понадобится интерфейс, который соединит ваш язык программирования с mongodb. В Python это бывает «pymongo» (есть другие, но, поверьте, pymongo легко освоить, чем другие). – x899

+0

Я использовал этот скрипт; но это создает новые поля в документе, которые также из массива ... его не обновляет ... db.dummy.find(). forEach (function (doc) { doc.mongodbdate = new Date (data.mongodbdate) db.dummy.save (doc); }) –

0

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

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