2013-06-03 4 views
1

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()을 할 때마다 매번 느리게 진행되는 것으로 보입니다.

속도를 높이는 방법이 있습니까? 어쩌면 내가 근본적으로 잘못하고있는 것일까? 모든 필드가 아닌 특정 필드 집합에서만 중복을 피할 필요가 있습니다 (즉, 숫자 2도 있습니다. 다른 숫자도 가능하지만 다른 모든 필드가 일치하는 경우에도 여전히 복사 할 수 있습니다).

답변

4

당신은 당신이 찾고있는 필드에 unique index (몽고 쉘 구문)을 구축 할 수 있습니다 :

db.mycollection.ensureIndex({_id:1, date1:1, date2:1, number:1, type:1}, {unique: true}); 

을 그리고 제약 조건 위반 예외를 캡처 (적절한 경우 무시) 중복이 삽입 될 때.

일반적으로 색인 조회를 통해 중복 검사가 수행되므로 성능이 향상됩니다.

1

삽입하기 전에 확인하는 것은 좋지 않습니다. 키의 중복을 방지하려면 기본 키를 사용하십시오. 당신을 위해 좋은 아니라면 적어도 mongo index

(내 생각)이 문제를 해결하는 가장 좋은 방법을 추가, how to set a primary key in mongodb

항목과 관련된 다음의 1 할 모든 필드에서 키를 생성하는 것입니다 2 :

인덱스 될 경우 해당 키에
  1. 점검 -
  2. 가 기본 키이 키를 확인 빠를 것이며, 삽입이 실패합니다
+1

: 아래 는 같을 것이다 방법입니다! –

0

Update Operations with the Upsert Flag을 참조하면 Upsert 플래그로 update() 작업을 수행 할 수 있습니다.

또한 이미 "_id"라는 MongoDB에 내장 된 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 
    ) 
+0

귀하의 제안 중 어느 것도 설명 된 경우에 도움이되지 않습니다 ... –

+0

예, 질문을 놓친 것 같아요. 아마도 이것은 find() + insert()를 대체 할 수있는 upsert 연산이 있다는 추가 정보로 사용될 수 있습니다. 너희들이이 일을 혼란스럽게 생각한다면 나는이 대답을 지울 수있다. :) – yoneal

+0

upsert는 관련이 있다고 생각한다. - "문서를 찾는다. 만약 당신이 그것을 업데이트하지 않는다면, 문서를 찾는다. "그러나 그것이 초기 문제가 진술 한 것과는 다른 것이라고 생각합니다 (존재한다면 그는 아무것도하고 싶지 않습니다) ... –

관련 문제