簡體   English   中英

檢查MongoDB中是否存在記錄

[英]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中設置主鍵

另外,如果這對您不利 ,請至少添加mongo索引

解決此問題的最佳方法(我認為)是從所有相關字段中生成密鑰,然后執行以下2個操作之一:

  1. 檢查該鍵,如果該鍵將是索引,則速度更快
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM