2016-07-04 3 views
10

Я работаю с набором данных, состоящим из вероятностных зашифрованных элементов, неотличимых от случайных выборок. Таким образом, последовательные шифрования одного и того же номера приводят к разным зашифрованным текстам. Однако они все еще сравнимы с помощью специальной функции, которая применяет алгоритмы, такие как SHA256, для сравнения двух зашифрованных текстов.Пользовательский индексный компаратор в MongoDB

Я хочу добавить список описанных зашифрованных текстов в базу данных MongoDB и проиндексировать ее с использованием древовидной структуры (то есть: AVL). Я не могу просто применить стандартную индексацию базы данных, потому что, как описано, записи должны быть сопоставимы с использованием специальной функции.

Пример: Предположим, что у меня есть база данных дб и коллекцию с составленную по следующему типу документа:

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

Кроме того, пусть F (целое, строка, строка) следующая функция :

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

где оператор | является стандартной функцией конкатенации.

Я хочу, чтобы выполнить следующий запрос эффективным способом, например, в коллекции с некоторой подходящей индексации:

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

для ч и л выбраны произвольно, но не константы. I.e .: Предположим, что я хочу найти все записи, которые удовлетворяют F (h1, l1, r) для некоторой пары (h1, l1). Позже, в другой момент, я хочу сделать то же самое, но используя (h2, l2) такие, что h1! = H2 и l1! = L2. h и l могут принимать любое значение в наборе целых чисел.

Как я могу это сделать?

+0

Большой вопрос!Не могли бы вы добавить пример кода, чтобы сделать это более понятным? – Shawyeok

+0

Shawyeok сделано. Проверь это. –

ответ

4

Вы можете выполнить этот запрос с помощью оператора $, где, но этот способ не может использовать индекс. Таким образом, для производительности запросов это зависит от размера вашего набора данных.

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

Перед выполнить код, приведенный выше, необходимо хранить функцию F на сервере MongoDB:

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

Ссылки:

+0

Я считаю, что на данный момент это лучший ответ. Это не создаст эффективную структуру индекса для моей базы данных, но, по крайней мере, переместит обработку в СУБД, а не в приложение. –

0

Я попробовал решение, сохранить результат функции в вашей коллекции, так что я изменил схему, как показано ниже:

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

Поле r._key это значение F(h,l,r) с постояннойh и l, а также поле r.value оригинал r раздел. Таким образом, вы можете создать индекс на поле r._key и условие запроса будет:

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

Да, действительно, ваше решение работает. Однако я считаю, что я не был достаточно ясен в своем вопросе. H и L не являются константами, а выбираются произвольно. I.e: Я хочу найти все записи, которые удовлетворяют F (H1, L1, r) для некоторой пары (H1, L1). Позже, в другой момент, я хочу сделать то же самое, но используя (H2, L2) такие, что H1! = H2 и L1! = L2. Я задам этот вопрос с этим ограничением. –

Смежные вопросы