【问题标题】:How to achieve unique _id value in MongoDB?如何在 MongoDB 中实现唯一的 _id 值?
【发布时间】:2016-01-08 09:33:22
【问题描述】:

我正在使用 Python2.7、Pymongo 和 MongoDB。我正在尝试摆脱 MongoDB 中的默认 _id 值。相反,我希望列的某些字段作为 _id。

例如:

{
    "_id" : ObjectId("568f7df5ccf629de229cf27b"),
    "LIFNR" : "10099",
    "MANDT" : "100",
    "BUKRS" : "2646",
    "NODEL" : "",
    "LOEVM" : ""
}

我想将 LIFNR+MANDT+BUKRS 连接为 100991002646 并对其进行哈希处理以实现唯一性并将其存储为新的_id。

但是散列对唯一 ID 的帮助有多大?以及如何实现它?

我知道在 Python 中使用默认哈希函数会为不同的机器(32 位/64 位)提供不同的结果。如果是真的,我将如何生成_ids?

但是我需要使用 LIFNR+MANDT+BUKRS。提前致谢。

【问题讨论】:

    标签: python mongodb mongodb-query pymongo aggregation-framework


    【解决方案1】:

    首先,您无法更新_id 字段。相反,您应该创建一个新字段并将其值设置为连接的字符串。要返回连接的值,您需要使用提供对聚合管道的访问的.aggregate() 方法。管道中的唯一阶段是 $project 阶段,您使用 $concat 运算符连接字符串并返回连接的字符串。 然后从那里迭代光标并使用"bulk" 操作更新每个文档。

    bulk = collection.initialize_ordered_bulk_op()
    count = 0
    cursor = collection.aggregate([
        {"$project": {"value": {"$concat": ["$LIFNR", "$MANDT", "$BUKRS"]}}}
    ])
    
    for item in cursor:
        bulk.find({'_id': item['_id']}).update_one({'$set': {'id': item['value']}})
        count = count + 1
        if count % 200 == 0:
            bulk.execute()
    if count > 0:
        bulk.execute()
    

    MongoDB 3.2 弃用了Bulk() 及其相关方法,因此您需要使用bulk_write() 方法。

    from pymongo import UpdateOne
    
    
    requests = []
    for item in cursor:
        requests.append(UpdateOne({'_id': item['_id']}, {'$set': {'id': item['value']}}))
    collection.bulk_write(requests)
    

    您的文档将如下所示:

    {'BUKRS': '2646',
      'LIFNR': '10099',
      'LOEVM': '',
      'MANDT': '100',
      'NODEL': '',
      '_id': ObjectId('568f7df5ccf629de229cf27b'),
      'id': '100991002646'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 2020-05-21
      相关资源
      最近更新 更多