2017-02-22 138 views
5

如何使用pymongo/pandas批量更新/插入mongoDb。 我得到的错误是batch op errors occurred 我之所以得到是因为我设置"_id",我想要做的。我的代码在第一次运行时运行良好,但第二次运行时失败。我想在工作流程中使用熊猫。数据确实有一个日期时间对象。使用PyMongo在MongoDB中批量插入/更新

语法与upsert = True完全不同,其中Update。有效的解决方案update将会有所帮助,其中"_id""qid"可以设置。 但是,有python datetime对象!

InSQL = 'SELECT * from database2.table2 ' 
sqlOut = pd.read_sql(InSQL,cxn) 
sqlOut['_id'] = "20170101" + ":"+ sqlOut['Var'] 

dfOut = sqlOut.to_json(orient='records',date_format='iso') 
try: 
    db["test"].insert_many(json.loads(dfOut)) 
except Exception as e: print e 

我已经给了一个 PT赏金,其中过期,没有回答。嗯......

+0

Mongo使用'string base input'并且不允许任何变量插入(仅限运算符)[请检查此](http://stackoverflow.com/questions/2803852/python-date-string-to-date-object), 'json.loads(dfOut)'你不能插入本地变量作为条目!主键'YYYYmmDDHHMMSS' +'计数器值' – dsgdfg

+0

您可以深入了解'BulkWriteError'的细节并更好地了解发生了什么。可能是您的个人定义的ID是重复的或违反了12个字节的限制。有关详细信息,请参阅http://stackoverflow.com/questions/30355790/mongodb-bulk-write-error。 –

+0

_id第一次工作的事实告诉我,12字节的限制不是问题。是的,_id或gid是dups,需要更新。 – Merlin

回答

0

你得到的错误,因为您尝试插入带有与第二个和后续insert_many调用中的现有文档的字段相冲突的字段的文档。您正确推断它可能是由于您明确地设置_id,这将与集合中现有的_id值冲突。

MongoDB automatically creates an unique index on _id,它禁止重复的值。

您需要更新或替换你的第一个文件(插入文件的第一个版本)后的电话文件。确实有一个“upsert”的概念,它将处理在集合中插入非先前存在的文档以及更新现有文档。

您的选择:

  • 最有效:pymongo.collection.Collection.bulk_write

    import pymongo 
    
    operations = [pymongo.operations.ReplaceOne(
        filter={"_id": doc["_id"]}, 
        replacement=doc, 
        upsert=True 
        ) for doc in json.loads(dfOut)] 
    
    result = db["test"].bulk_write(operations) 
    # handle results 
    

注意,它的效率还取决于字段是否是收藏,这亦是对的情况下收录_id。 (见pymongo.operations.ReplaceOne

注:pymongo.collection.Collection.update_many既然你不是似乎不适合您的需求试图在给定过滤器的所有匹配上设置相同的值。