Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如果将_id以外的密钥视为主键,如何插入_多个防止重复记录?_Mongodb_Pymongo - Fatal编程技术网

Mongodb 如果将_id以外的密钥视为主键,如何插入_多个防止重复记录?

Mongodb 如果将_id以外的密钥视为主键,如何插入_多个防止重复记录?,mongodb,pymongo,Mongodb,Pymongo,我有一个现有的MongoDB集合,其中每个文档如下- { "_id":"5e7467b76fbf38cd13c4f322", "Revision":"HEXDEF", "Variant":"2800", } 我想使用insert\u many来插入一个数组,比如- data = [ { "Revision":"ABXDEF", "Variant":"1800", }, { "Revision":"H

我有一个现有的MongoDB集合,其中每个文档如下-

{
    "_id":"5e7467b76fbf38cd13c4f322",
    "Revision":"HEXDEF",
    "Variant":"2800",
}
我想使用insert\u many来插入一个数组,比如-

data = [
    {
        "Revision":"ABXDEF",
        "Variant":"1800",
    },
    {
        "Revision":"HEXDEF",
        "Variant":"2400",
    }
]

这里,我将修订视为我的主键,不想用它来插入一个记录,如果它已经存在。实现这一目标的正确方法是什么

目前我的MongoDB查询是-

db[collection].insert_many(data)

你有两个选择;使用_id代替修订或创建唯一索引。我更喜欢后一种方法。此代码示例可能有助于:

from pymongo import MongoClient
from pymongo.errors import BulkWriteError

db = MongoClient()['mydatabase']
db.mycollection.create_index('Revision', unique=True)
data = [
    {
        "Revision":"ABXDEF",
        "Variant":"1800",
    },
    {
        "Revision":"HEXDEF",
        "Variant":"2400",
    },
    {
        "Revision": "ABXDEF",
        "Variant": "2700",
    },
    {
        "Revision": "ZZZZZZ",
        "Variant": "3000",
    }
]

# ordered=True (default) will stop writing on an error (only 2 records added)
# ordered=False will continue after with any subsequent inserts after the error
try:
    result = db.mycollection.insert_many(data, ordered=True)
    print (f'All ok - {result.nInserted} records inserted')
except BulkWriteError as e:
    writeErrors = e.details.get('writeErrors')
    print (f"{len(writeErrors)} WriteErrors and {e.details.get('nInserted')} records inserted")
    print(writeErrors)
你考虑过一个新的计划吗?