11

我有一个集合,其中我的所有文档都至少有这两个字段,比如说nameurl(哪里url是唯一的,所以我在上面设置了一个唯一索引)。现在,如果我尝试插入带有副本的文档url,它将给出错误并停止程序。我不想要这种行为,但我需要类似mysql's 的东西insert or ignore,这样 mongoDB 不应该插入重复的文档url并继续下一个文档。

是否有一些参数可以传递给insert命令来实现这种行为?pymongo我通常使用as进行一批插入:

collection.insert(document_array)

collection是一个集合,document_array是一个文档数组。

那么有什么方法可以实现insert or ignore多文档插入的功能吗?

4

7 回答 7

13

Set the continue_on_error flag when calling insert(). Note PyMongo driver 2.1 and server version 1.9.1 are required:

continue_on_error (optional): If True, the database will not stop processing a bulk insert if one fails (e.g. due to duplicate IDs). This makes bulk insert behave similarly to a series of single inserts, except lastError will be set if any insert fails, not just the last one. If multiple errors occur, only the most recent will be reported by error().

于 2012-09-04T17:07:52.523 回答
12

使用 insert_many(),并设置ordered=False。

这将确保尝试所有写入操作,即使有错误: http ://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.insert_many

于 2015-08-04T04:24:57.900 回答
11

尝试这个:

try:
    coll.insert(
        doc_or_docs=doc_array,
        continue_on_error=True)
except pymongo.errors.DuplicateKeyError:
    pass

如果插入发生错误(例如尝试为唯一索引插入重复值),插入操作仍然会抛出异常,但不会影响数组中的其他项。然后,您可以吞下如上所示的错误。

于 2012-09-04T16:18:13.677 回答
0

如果插入失败,为什么不把你的调用.insert()放在一个块内并继续呢?try: ... except:

此外,您还可以使用带有标志的常规update()调用。upsert详细信息:http ://www.mongodb.org/display/DOCS/Updating#Updating-update%28%29

于 2012-04-30T18:58:38.443 回答
0

如果您的 python 脚本中的文档数组已经在内存中,为什么不通过迭代它们来插入它们,并简单地捕获由于唯一索引而导致插入失败的那些?

for doc in docs:
  try:
    collection.insert(doc)
  except pymongo.errors.DuplicateKeyError:
    print 'Duplicate url %s' % doc

其中 collection 是从您的连接/数据库实例创建的集合的实例,而 docs 是您当前将传递给 insert 的字典(文档)数组。

您还可以决定如何处理违反except块内唯一索引的重复键。

于 2012-04-30T19:00:22.743 回答
-2

强烈建议使用upsert

  stat.update({'location': d['user']['location']}, \
       {'$inc': {'count': 1}},upsert = True, safe = True)

这里stat是集合,如果访客位置已经存在于集合中,count则增加一,否则count设置为1

这是文档链接http://www.mongodb.org/display/DOCS/Updating#Updating-UpsertswithModifiers

于 2012-04-30T19:10:32.987 回答
-2

我在做什么 :

  1. 生成我要插入的 MongoDB id 数组(在我的例子中是一些值的哈希)
  2. 删除现有的ID(我使用的是Redis队列bcoz性能,但你可以查询mongo)
  3. 插入您清理的数据!

Redis 非常适合,您可以根据需要使用 Memcached 或 Mysql 内存

于 2012-08-29T14:47:34.327 回答