Использование insert_one не беспокоит, когда данные включают datetime.datetime - PullRequest
0 голосов
/ 17 января 2020

Я использую Python scrapy (1.8.0), чтобы очистить некоторые данные и сохранить их в mongodb с pymongo.

. Это работает, когда я использую Python2 и более старую pymongo версию.

Но когда я попытался использовать Python3 и pymongo 3.10.1, я обнаружил, что вставка документа не работает.

Я обнаружил, что проблема связана с datetime,

Вот так:

'releasedTime': [datetime.datetime(2020, 1, 17, 14, 30),datetime.datetime(2020, 1, 16, 18, 10),datetime.datetime(2020, 1, 17, 22, 0)]

Данные о дате поступают примерно так:

stripSingleTime = singleTime.strip() # 14:30
myTime = datetime.datetime.strptime(stripSingleTime, '%H:%M').time() # 14:30:00
myDateTime = datetime.datetime.combine(datetime.date.today(), myTime) # 2020-01-17 14:30:00
# x is my for loop argument
myDateTimeArray[x].append(myDateTime)  # [[datetime.datetime(2020, 1, 17, 14, 30)], []]

Вот примерно insert_one:

import pymongo
from pymongo import MongoClient
from scrapy.utils.project import get_project_settings
settings = get_project_settings()
import datetime

class MongoDBPipeline(object):

    global theaters
    theaters = []

    def __init__(self):
        connection = MongoClient(
            settings['MONGODB_SERVER'],
            settings['MONGODB_PORT'])
        self.db = connection[settings['MONGODB_DB']]
        self.collection = self.db[settings['MONGODB_COLLECTION']]
    def open_spider(self, spider):
        print ('Pipelines => open_spider =>', spider)

    def process_item(self, item, spider):
        global theaters

        self.collection = self.db[type(item).__name__.replace('_Item','')]

        if  item['theater'] not in theaters:
            theaters.append(item['theater'])
            self.collection.remove({'theater': item['theater']})

        # self.collection.insert_one(mydict) is working
        mydict = { 'name': 'RUNOOB', 'alexa': '10001', 'url': 'https://www.runoob.com' }

        test = {
        'geometry': {'coordinates': [120.196866, 22.99322], 'type': 'Point'}, 
        'phone': '06-2205151',
        'theater': 'TodayTainan',
        'movie': [{
        'enName': 'The Lion King',
        'goodMinePoint': 0.75,
        'imdbScore': '8.5',
        'photoHref': 'https://movies.yahoo.com.tw/x/r/w420/i/o/production/movies/June2019/M07RYsvcBWpi3xJtjCQF-2714x3878.jpg',
        'releasedTime': [datetime.datetime(2020, 1, 17, 14, 30)],
        'rottenScore': '93%',
        'videoId': ['MQuUkET0lQg', 'he2rj_8XwsE']
        }]
        }

        self.collection.insert_one(test) # insert the dummy object test is not working

        self.collection.create_index([("geometry", pymongo.GEOSPHERE)])

        return item

Почему self.collection.insert_one(test) не работает?

Я думаю, что-то не так между pymongo и mongodb. Они не имеют дело с моим datetime.

. Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

1 голос
/ 18 января 2020

Измените

    self.collection.insert_one(test) # insert the dummy object test is not working

на

    import traceback
    try:
        result = self.collection.insert_one(test) # insert the dummy object test is not working
        print (result.inserted_id)
    except Exception:
        traceback.print_exc()

и сообщите результат.

...