Как лучше всего фильтровать коллекцию MongoDB, используя предикат - PullRequest
1 голос
/ 25 октября 2011

Мы бы хотели отфильтровать коллекцию MongoDB, используя запрос overspecified 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 может содержать больше атрибутов, чем указано в требованиях документа в A, и что требования в A и атрибуты в D не фиксируются?Мы хотели бы не указывать каждый возможный атрибут в D во всех A.req документах, поскольку хотим, чтобы наши требования были максимально гибкими.

1 Ответ

3 голосов
/ 25 октября 2011

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

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

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

...