如何在MongoDB中实现唯一的_id值?

时间:2016-01-08 09:33:23

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

我正在使用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。提前谢谢。

2 个答案:

答案 0 :(得分:0)

首先,无法更新_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'}

答案 1 :(得分:0)

您可以使用自己的哈希函数,然后它将不依赖于架构,更重要的是,您将知道它对您的变量做了什么。