2016-07-04 6 views
10

임의의 샘플과 구별 할 수없는 확률 적 암호화 된 요소로 구성된 데이터 세트로 작업하고 있습니다. 이렇게하면 같은 번호의 순차적 인 암호화가 서로 다른 암호문을 생성합니다. 그러나 SHA256과 같은 알고리즘을 적용하여 두 개의 암호문을 비교하는 특수 함수를 통해 비교할 수 있습니다.MongoDB의 사용자 정의 인덱스 비교기

설명 된 암호 텍스트 목록을 MongoDB 데이터베이스에 추가하고 트리 기반 구조 (예 : AVL)를 사용하여 색인을 생성하려고합니다. 설명 된 것처럼 특수 기능을 사용하여 레코드를 비교할 수 있어야하기 때문에 단순히 데이터베이스의 기본 인덱싱을 적용 할 수 없습니다.

예 : I 데이터베이스 DB 다음 문서 형식으로 이루어지는 컬렉션 C 있다고 가정 또한

{ 
    "_id":ObjectId, 
    "r":string 
} 

를 F (INT, 문자열, 문자열) 다음 함수하자 :

F(h,l,r) = (SHA256(l | r) + h) % 3 

여기서 연산자 | 표준 연결 기능입니다.

나는 같은 몇 가지 적절한 인덱싱 된 컬렉션과 같이 효율적인 방법에서 다음 쿼리 를 실행하려면 : 시간 및 임의가 아닌 상수 선택 리터에 대한

db.c.find({ F(h,l,r) :{ $eq: 0 } }) 

. I : 어떤 쌍 (h1, l1)에 대해 F (h1, l1, r)를 만족하는 모든 레코드를 찾고 싶다고 가정합니다. 나중에, 다른 순간에 나는 같은 것을하고 싶지만 h1! = h2와 l1! = l2와 같이 (h2, l2)를 사용하고 싶다. h와 l은 정수들의 집합에서 어떤 값을 취할 수있다.

어떻게하면됩니까?

+0

위대한 질문을!코드 예제를 추가하여 더 명확하게 만들 수 있습니까? – Shawyeok

+0

Shawyeok가 완료되었습니다. 확인해 봐. –

답변

4

당신은이 쿼리 운영자에게 $ 곳에을 사용하여 수행 할 수 있지만,이 방법은 인덱스를 사용할 수 없습니다. 따라서 쿼리 성능의 경우 데이터 집합의 크기에 따라 달라집니다.

db.c.find({$where: function() { return F(1, "bb", this.r) == 0; }}) 

는 전에 MongoDB를 서버에 함수 F를 저장할 필요, 위의 코드를 실행합니다

db.system.js.save({ 
    _id: "F", 
    value: function(h, l, r) { 
     // the body of function 
    } 
}) 

링크 :

+0

나는 이것이 현재로서는 최선의 대답이라고 믿는다. 이렇게하면 데이터베이스에 대한 효율적인 인덱스 구조가 생성되지는 않지만 적어도 애플리케이션보다는 DBMS로 처리가 이동합니다. –

0

내가 컬렉션에서 함수의 결과를 저장하는 솔루션을 시도했습니다, 그래서 다음과 같은 스키마를 변경 :

{ 
    "_id": ObjectId, 
    "r": { 
    "_key": F(H, L, value), 
    "value": String 
    } 
} 

필드 r._key일정h과와 F(h,l,r)의 값은 l이고 필드 r.value은 원본 r 필드입니다. 그래서 당신은 필드 r._key에 인덱스를 만들 수 있으며, 쿼리 조건은 다음과 같습니다

db.c.find({ "r._key" : 0 }) 
+0

네, 실제로 솔루션이 작동합니다. 그러나 나는 내 질문에 충분히 명확하지 않았다고 생각한다. H와 L은 상수가 아니라 임의로 선택됩니다. I : 어떤 쌍 (H1, L1)에 대해 F (H1, L1, r)를 만족하는 모든 레코드를 찾고 싶습니다. 나중에 다른 순간에, 나는 같은 일을하고 싶지만 H1! = H2와 L1! = L2가되도록 (H2, L2)를 사용하고 싶다. 나는이 제약 조건으로 질문을 업데이트 할 것이다. –