MongoDB: Найти / отфильтровать данные по дате рождения сегодня без агрегирования
Я работаю над продуктом, в который пользователь может загружать данные, и тип данных для данных будет динамически выбираться пользователем при загрузке. Я храню данные в mongodb. Пользователь может написать правило на переднем конце, чтобы сегментировать данные. Одним из требований является то, что правило может быть задано таким образом, чтобы находить все записи, чья дата рождения сегодня. Для этого мне может понадобиться отфильтровать документ по дням и месяцам. На данный момент я строю монго-запрос (java) как BasicDBObject динамически на основе правила, заданного пользователем.
Таким образом, фильтр должен иметь вид, подобный $date.month=12 && $date.day=10 (чтобы получить все записи, чья дата рождения не превышает 10 декабря).
Может кто-нибудь помочь, как это может быть достигнуто в запросе Монго?
2 ответа
Вот как я перебираю документы. Здесь нет никаких скоплений.
MongoCollection<Document> mongoCollection = mongoDatabase.getCollection(collectionName);
FindIterable<Document> iterable;
iterable = (ruleQuery == null) ? mongoCollection.find().limit(limit).skip(skipCount) : mongoCollection.find(ruleQuery).limit(limit).skip(skipCount);
iterable = (projectionFieldsQuery == null) ? iterable : iterable.projection(projectionFieldsQuery);
iterable = (sortQuery == null) ? iterable : iterable.sort(sortQuery);
return iterable.iterator();
Нет ничего плохого в использовании структуры агрегации. Я бы сказал, что рано или поздно это будет по умолчанию для всех запросов - по крайней мере, для внутренних целей...
Тем не менее, без него у вас фактически есть три варианта, поскольку для "обычных" запросов нет операторов даты:
- Вы можете попытаться использовать оператор $where, который не будет очень эффективным: https://docs.mongodb.com/manual/reference/operator/query/where/
- Вы можете хранить информацию о дате (возможно, дополнительно) в отдельных полях и просто использовать их в своих запросах. Эти поля могут быть проиндексированы, поэтому это будет быстро.
- Даты хранятся в виде меток времени Unix в MongoDB ( https://docs.mongodb.com/manual/reference/method/Date/). Таким образом, вы можете попытаться вычислить соответствующие числа или диапазоны и получить к ним доступ, используя (кучу) длинных значений.