#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 имеет требование в проверке, соответствует ли он этому требованию». Честно говоря, я думаю, что поиск более подходящей схемы мог бы быть более элегантным путем.