繁体   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