我正在使用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。提前谢谢。
答案 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)
您可以使用自己的哈希函数,然后它将不依赖于架构,更重要的是,您将知道它对您的变量做了什么。