MongoDB批量写入错误

26

我正在执行批量写入操作

bulk = new_packets.initialize_ordered_bulk_op()

bulk.insert(packet)

output = bulk.execute()

但是,我遇到了一个错误,我的解释是packet不是字典类型。但是我知道它是字典类型的。可能的问题是什么?

以下是错误信息:

    BulkWriteError                            Traceback (most recent call last)
    <ipython-input-311-93f16dce5714> in <module>()
          2 
          3 bulk.insert(packet)
    ----> 4 output = bulk.execute()

    C:\Users\e306654\AppData\Local\Continuum\Anaconda\lib\site-packages\pymongo\bulk.pyc in execute(self, write_concern)
583         if write_concern and not isinstance(write_concern, dict):
584             raise TypeError('write_concern must be an instance of dict')
    --> 585         return self.__bulk.execute(write_concern)

    C:\Users\e306654\AppData\Local\Continuum\Anaconda\lib\site-packages\pymongo\bulk.pyc in execute(self, write_concern)
429             self.execute_no_results(generator)
430         elif client.max_wire_version > 1:
    --> 431             return self.execute_command(generator, write_concern)
432         else:
433             return self.execute_legacy(generator, write_concern)

    C:\Users\e306654\AppData\Local\Continuum\Anaconda\lib\site-packages\pymongo\bulk.pyc in execute_command(self, generator, write_concern)
296                 full_result['writeErrors'].sort(
297                     key=lambda error: error['index'])
    --> 298             raise BulkWriteError(full_result)
299         return full_result
300 

    BulkWriteError: batch op errors occurred

什么是数据包?print(packet)的输出是什么? - styvane
好的,问题出在我明确地分配了_id,结果字符串比12字节的限制大,这是我的错误。 - David Makovoz
1
PyMongo承认这是他们文档中的常见问题,并提供了有关为什么会发生这种情况的见解。 - tutuDajuju
6个回答

31

可能有很多原因......
最好的方法是尝试使用try...catch...来捕捉异常并检查错误

from pymongo.errors import BulkWriteError
try:
    bulk.execute()
except BulkWriteError as bwe:
    print(bwe.details)
    #you can also take this component and do more analysis
    #werrors = bwe.details['writeErrors']
    raise

20

好的,问题出在我明确地指定了 _id,并且字符串超过了12字节的限制。我的错误。


4
哇,我遇到了完全相同的问题,谢谢你提供的解决方案! - Dennis Golomazov

17

您需要检查两件事:

  1. 如果您正在定义自己的键,请检查重复。
  2. 能够管理自定义类型,在我的情况下,我尝试传递一个无法转换为有效objectId的哈希类型对象,这将导致我陷入恶性循环(我将myObject解决为字符串以解决此问题)。

逐个插入将给您一个了解发生了什么的想法。


1
除了以上内容,还要检查您的“unique”索引。如果您正在进行批量插入并已指定数据中不存在的索引,则会出现此错误。
例如,我不小心将“name”指定为唯一索引,并且我正在插入的数据没有名为“name”的键。在插入第一个条目后,它将抛出此错误,因为实际上正在插入另一个具有null的唯一名称文档。
这是我的模型定义的一部分,在其中声明了一个唯一索引:
self.conn[self.collection_name].create_index(
            [("name", ASCENDING)],
            unique=True,
        )

以下是抛出错误的详细信息:

{'writeErrors': [{'index': 1, 'code': 11000, 'keyPattern': {'name': 1},
'keyValue': {'name': None}, 'errmsg': 'E11000 duplicate key error collection:
troposphere.temp index: name_1 dup key: { name: null }'
...

更多资源: MongoDB E11000重复键错误


0

我试图插入两个具有相同"_id"和其他键的文档。

  1. 为不同的文档插入不同的"_id"。或者
  2. 删除"_id",系统会自动生成一个随机的"_id"。

这个问题已经被 @Miguel Angel 七年前的回答所解决。 - Jeremy Caney

-1

尝试使用调试器,它应该会给你一个带有精确错误的errmsg和正在尝试插入的op对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接