【发布时间】:2019-02-04 06:57:32
【问题描述】:
我正在使用 MongoDB 4.0.1 和 Pymongo 与 pyhton 3.5。我必须每 30-60 秒循环超过 12000 个项目并将新数据添加到 MongoDB 中。对于这个例子,我们将讨论用户、宠物和汽车。用户可以获得 1 辆汽车和 1 只宠物。
我需要宠物 ObjectID 和汽车 ObjectID 来创建我的用户,所以我必须在循环中一一添加它们,这非常慢。如果数据不存在,则查找现有数据并添加它们大约需要 25 秒。
while dictionary != False:
# Create pet if not exist
existing_pet = pet.find_one({"code": dictionary['pet_code']})
if bool(existing_pet):
pet_id = existing_pet['_id']
else:
pet_id = pet.insert({
"code" : dictionary['pet_code'],
"name" : dictionary['name']
})
# Call web service to create pet remote
# Create car if not exist
existing_car = car.find_one({"platenumber": dictionary['platenumber']})
if bool(existing_car):
car_id = existing_car['_id']
else:
car_id = car.insert({
"platenumber" : dictionary['platenumber'],
"model" : dictionary['model'],
"energy" : 'electric'
})
# Call web service to create car remote
# Create user if not exist
existing_user = user.find_one(
{"$and": [
{"user_code": dictionary['user_code']},
{"car": car_id},
{"pet": pet_id}
]}
)
if not bool(existing_user):
user_data.append({
"pet" : pet_id,
"car" : car_id,
"firstname" : dictionary['firstname'],
"lastname" : dictionary['lastname']
})
# Call web service to create user remote
# Bulk insert user
if user_data:
user.insert_many(user_data)
我为用于 find_one 的每一列创建了索引:
db.user.createIndex( { user_code: 1 } )
db.user.createIndex( { pet: 1 } )
db.user.createIndex( { car: 1 } )
db.pet.createIndex( { pet_code: 1 }, { unique: true } )
db.car.createIndex( { platenumber: 1 }, { unique: true } )
有没有办法加快这个循环?有什么聚合或其他东西可以帮助我吗?或者也许是另一种方式来做我想做的事?
我愿意接受所有建议。
【问题讨论】:
-
不要做 12000 次 find_one 查询,做 1 次查询以使用 $in 运算符带来所有存在
-
你能举个例子吗?
标签: python mongodb optimization pymongo