【问题标题】:Set unique field in list of dictionaries to be inserted into mongo db在要插入 mongodb 的字典列表中设置唯一字段
【发布时间】:2020-09-25 09:14:25
【问题描述】:

我有一个类似这样的字典列表;

json_data = [
  {
    "CODE": "018906",
    "X": "29813.66349",
    "Y": "28697.520760000003"
  },
  {
    "CODE": "018907",
    "X": "30041.8389",
    "Y": "28602.98724"
  },
  {
    "CODE": "018910",
    "X": "31966.120789999997",
    "Y": "29115.75337"
  },
]

我尝试将 json_data 插入到 mongodb 集合 mongo_collection 中。

mongo_collection.insert_many(json_data)

运行成功。但是,我希望关键字段 CODE 是唯一的,如果有重复,插入应该会失败。即使有重复的CODE,上面的行也会插入每个文档。如何使 CODE 键唯一?我愿意使用像 mongoengine 这样的 python 库。

我希望 CODE 类似于关系数据库中的主键。

我正在使用 python 3.7、mongodb 4.2.7 和 pymongo。

【问题讨论】:

  • 为每条记录生成一个 UUID,stackoverflow.com/questions/534839/… 或者您正在寻找一个正在运行的序列?
  • @Sushanth,不需要运行序列。只要字段可以像关系数据库一样保持唯一,就足够了。
  • 那么你可以使用 UUID

标签: python python-3.x mongodb pymongo mongoengine


【解决方案1】:

我想在 Anurag Wagh 的回答的基础上回答我自己的问题,因为他使用的语法不是 python。我已将他的答案标记为正确。

由于我用的是pymongo,所以代码的语法应该是;

import pymongo
mongo_collection.create_index([("CODE", pymongo.ASCENDING)], unique=True)

【讨论】:

    【解决方案2】:

    在插入之前, 您需要在 MongoDB 中创建一个 index 并将 CODE 字段标记为唯一索引

    creating index in mongo

    db.mongo_collection.createIndex({CODE:1}, {unique:true})
    

    如果您尝试插入已经存在的CODE,这将确保您得到重复键错误。

    如果您无权访问 MongoDB 服务器。

    您需要使用与CODE 相同的值填充_id。由于 _id 是 mongo 中的默认主索引。

    json_data = [
      {
        "_id": "018906",
        "CODE": "018906",
        "X": "29813.66349",
        "Y": "28697.520760000003"
      },
      {
        "_id": "018907",
        "CODE": "018907",
        "X": "30041.8389",
        "Y": "28602.98724"
      },
      {
        "_id": "018910",
        "CODE": "018910",
        "X": "31966.120789999997",
        "Y": "29115.75337"
      },
    ]
    

    【讨论】:

    • 感谢您的回答。你如何确定{CODE:1}?为什么是 1 而不是其他数字?
    • {field:1} 这里的“1”表示创建升序索引,即创建索引时,它们将按升序排序。 docs.mongodb.com/manual/reference/method/…
    猜你喜欢
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2019-10-05
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2022-10-18
    相关资源
    最近更新 更多