2010-05-24 26 views
46

Trong MongoDB, tôi có tài liệu có trường được gọi là "ClockInTime" được nhập từ CSV dưới dạng chuỗi.Làm cách nào để chuyển đổi thuộc tính trong MongoDB từ văn bản thành loại ngày?

Tuyên bố db.ClockTime.update() thích hợp trông như thế nào để chuyển đổi các giá trị dựa trên văn bản này sang kiểu dữ liệu ngày?

+0

Tôi muốn thực hiện tuyên bố này trong vỏ Mongo như một bản cập nhật tại chỗ. –

+1

sẽ là tốt để xem một số dữ liệu mẫu tức là "ClockTime": "-233744483733" – backdesk

Trả lời

77

Mã này nên làm điều đó:

> var cursor = db.ClockTime.find() 
> while (cursor.hasNext()) { 
... var doc = cursor.next(); 
... db.ClockTime.update({_id : doc._id}, {$set : {ClockInTime : new Date(doc.ClockInTime)}}) 
... } 
+0

Điều đó đã làm việc ... thx ... –

+2

@Kristina - Phew, điều này đã tiết kiệm được rất nhiều thời gian và nhờ tác giả yêu cầu như vậy câu hỏi. –

+1

Cũng giống như một lưu ý phụ (và tôi đứng sửa) nhưng nếu bạn đang chuyển đổi từ một giá trị tem thời gian, một chuỗi sẽ không hoạt động. Nó phải là một int dài. Ví dụ: giá trị thời gian đóng dấu của 206281199529 không được là '206281199529' trong tệp nguồn (CSV hoặc JSON). Tôi không chắc chắn tại sao không - thử nó với v2.2.2 và mỗi khi nó thiết lập ngày để epoch. – backdesk

13

tôi có chính xác tình hình giống như Jeff Fritz.

Trong trường hợp của tôi, tôi có thành công với các giải pháp đơn giản sau đây:

db.ClockTime.find().forEach(function(doc) { 
    doc.ClockInTime=new Date(doc.ClockInTime); 
    db.ClockTime.save(doc); 
    }) 
1

Nếu bạn cần phải kiểm tra nếu trường đã đã được chuyển đổi, bạn có thể sử dụng điều kiện này:

/usr/bin/mongo mydb --eval 'db.mycollection.find().forEach(function(doc){ 
    if (doc.date instanceof Date !== true) { 
     doc.date = new ISODate(doc.date); 
     db.mycollection.save(doc); 
    } 
});' 

Nếu không, dòng lệnh có thể bị hỏng.

5

Đây là một mẫu mã chung trong python sử dụng pymongo

from pymongo import MongoClient 
from datetime import datetime 

def fixTime(host, port, database, collection, attr, date_format): 
    #host is where the mongodb is hosted eg: "localhost" 
    #port is the mongodb port eg: 27017 
    #database is the name of database eg : "test" 
    #collection is the name of collection eg : "test_collection" 
    #attr is the column name which needs to be modified 
    #date_format is the format of the string eg : "%Y-%m-%d %H:%M:%S.%f" 
    #http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior 
    client = MongoClient(host, port) 
    db = client[database] 
    col = db[collection] 
    for obj in col.find(): 
     if obj[attr]: 
      if type(obj[attr]) is not datetime: 
       time = datetime.strptime(obj[attr],date_format) 
       col.update({'_id':obj['_id']},{'$set':{attr : time}}) 

để biết thêm: http://salilpa.com/home/content/how-convert-property-mongodb-text-date-type-using-pymongo

Các vấn đề liên quan