2017-01-23 15 views
1

MongoDBでは、「date」というフィールドのある文書があり、それは配列になっています。その後文字列の日付をMongoDBのISO日付に変更しますか?

{ 
"_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にも1つの解決策がありますが、それは配列のためだと思う私の文書の新しいフィールドを追加している、私は私の既存のものを更新したい。続き

答えて

0

あなたはdateutilモジュールを使用することができます(sudoのPIPインストールのpython-dateutil)

はdatatimeオブジェクトにISOの文字列を変換し、その後のmongoデータベースに挿入するサンプルコードです。 MongoDBの

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

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におけるISO形式への文字列の日付を更新することができます。

+0

どうすればいいですか? –

+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); 
}) 
関連する問題