[英]Checking if record exists in MongoDB
我正在建立一個MongoDB數據庫,問題是我想避免重復輸入。 目前,我正在執行此操作(僅在檢查條目是否不存在后才插入文檔):
from pymongo import Connection
import pandas as pd
from time import strftime
from collections import OrderedDict
connection = Connection()
db = connection.mydb
collection = db.mycollection
data = pd.read_csv("data/myfile.csv", parse_dates=[2,5])
for i in range(len(data)):
if(collection.find({ "id": data.ix[0], \
"date1": data.ix[i, 2].strftime("%Y-%m-%d"), \
"date2": data.ix[i, 5].strftime("%Y-%m-%d"), \
"number": int(data.ix[i, 6]), \
"type": data.ix[i, 7]}).count() == 0):
collection.insert(here goes what I'd like to insert)
哪一個工作正常,但是已經存在嚴重的性能問題(只有約100Mb的數據),因為每次執行find()
似乎都會使速度大大降低。
有辦法加快速度嗎? 也許我從根本上做錯了嗎? 我需要避免僅在某些字段集上而不是在所有字段上重復(即,還有“ number2”,它可以不同,但是如果所有其他字段都匹配,我仍然希望將其作為重復項)。
您可以在要搜索的字段上建立唯一索引 (mongo shell語法):
db.mycollection.ensureIndex({_id:1, date1:1, date2:1, number:1, type:1}, {unique: true});
並在插入重復項時捕獲約束違反異常(如果合適,將其忽略)。
通常,這可以提高性能,因為通過索引查找來完成重復檢查。
插入前進行檢查不是防止這種情況的好方法。 為防止重復鍵,請使用主鍵。 查看如何在mongodb中設置主鍵
解決此問題的最佳方法(我認為)是從所有相關字段中生成密鑰,然后執行以下2個操作之一:
您可以使用Upsert標志執行update()操作,請參閱使用Upsert標志進行更新操作 。
另外,MongoDB中已經有一個內置的ID,名為“ _id”,因此您可以根據需要使用它。 以下是它的外觀:
collection.update(
{ "_id": ObjectID(data.ix[0]),
"date1": data.ix[i, 2].strftime("%Y-%m-%d")
},
{ "_id": ObjectID(data.ix[0]),
"date1": data.ix[i, 2].strftime("%Y-%m-%d")
},
True
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.