Как наилучшим образом фильтровать коллекцию MongoDB с помощью предиката

#mongodb #filter #predicate

#mongodb #Фильтр #предикат

Вопрос:

Мы хотели бы отфильтровать коллекцию MongoDB с помощью «сверхспецифицированного» запроса find(). Например: collection A , коллекция, которую мы хотим отфильтровать, содержит документы, содержащие набор требований к атрибутам. Примерами могут служить документ a , который содержит требование {req: age:{min:20,max:30}} и b который содержит требование {req: gender:male} .

У нас также есть документ, d , из collection D которого содержатся следующие атрибуты: d = {age:21, gender: male} .

В этом случае оба a и b должны быть в наборе документов, который d имеет право на получение, поскольку d удовлетворяет требованиям для обоих.

Однако, если мы включим все d атрибуты в find запрос, мы получим db.A.find({d.age > req.age.min, d.age < req.age.max, d.gender: req.gender}) , что исключит оба a и b из нашего результата.

Каков наилучший способ выбрать все документы, A которые d соответствуют требованиям, учитывая, что d они могут содержать больше атрибутов, чем требования документа в specify , и что требования в A и атрибуты в D не являются фиксированными? Мы хотели бы избежать указания всех возможных атрибутов D во всех A.req документах, поскольку мы хотели бы, чтобы наши требования были максимально гибкими.

Ответ №1:

Простых способов сделать это не существует. Единственный путь, который вы можете предпринять, — это выполнить проверку существования каждого требования, что не приводит к самым элегантным запросам, которые только можно себе представить. Использование вашего формата запроса :

 db.A.find({$and:[{req.age.min:{$exists:true}}, {d.age > req.age.min}], ....)
 

Другими словами. Вы изменяете свой запрос таким образом, чтобы он следовал «если атрибут D имеет требование в проверке, соответствует ли он этому требованию». Честно говоря, я думаю, что поиск более подходящей схемы мог бы быть более элегантным путем.