Критерии сделать монго запрос - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь сделать запрос, чтобы найти пользователей, у которых день рождения.Этот запрос:

db.getCollection('_user').find({ 
    "$and" : [
        {"$expr" : [{ "$dayOfMonth": "$time_created" } , { "$dayOfMonth": new Date() }]}, 
        {"$expr" : [ { "$month": "$time_created" } , { "$month": new Date() }]}, 
        {"$expr" : { "$ne" : [ { "$year": "$time_created" } , { "$year": new Date() }]}}
    ]
})

Теперь я попытался при весенней загрузке с критериями сделать этот запрос:

criteria.andOperator(
        Criteria.where("$expr").is(Arrays.asList("{ \"$dayOfMonth\": \"$time_created\" }", "{ \"$dayOfMonth\": new Date() }")),
        Criteria.where("$expr").is(Arrays.asList("{ \"$month\": \"$time_created\" }", "{ \"$month\": new Date() }")),
        Criteria.where("$expr").ne(Arrays.asList("{ \"$year\": \"$time_created\" }", "{ \"$year\": new Date() }"))
);

, если я сделаю это так, я получу как окончательный запрос: http://prntscr.com/mmxbg3 и все это \ и "создают проблемы

, но если я выполняю запрос критериев без этих символов, то возникают ошибки из-за синтаксиса:

criteria.andOperator(
        Criteria.where("$expr").is({"$dayOfMonth": "$time_created" }, { "$dayOfMonth": new Date() })),
        Criteria.where("$expr").is(Arrays.asList({ "$month": "$time_created" }, { "$month": new Date() })),
        Criteria.where("$expr").ne(Arrays.asList({ "$year": "$time_created" }, { "$year": new Date() }))
);

Кто-нибудь знаетКак я могу построить этот запрос?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019
 Aggregation datastoreAggr = newAggregation(match(Criteria.where("metaId.ref.uuid").in(datapodUUID)),sort(Direction.DESC, "createdOn"));

        AggregationResults<DataStore> datastoreResults = mongoTemplate.aggregate(datastoreAggr, "datastore", DataStore.class);
        List<DataStore> datastoreList = datastoreResults.getMappedResults();

Вы можете напрямую использовать встроенную функцию Java, и вы можете передать поле, как я прошел.Вам нужно использовать агрегацию, вы можете использовать критерии. Здесь опубликован ответ, связанный с критериями, пожалуйста, посмотрите на это

: - Пожалуйста, ознакомьтесь с этим документом для справки, связанной с запросом

Я предлагаюВы можете хранить dateOfBirthday как миллисекунду времени в своем пользовательском документе и можете напрямую извлекать всех пользователей, написав простой метод.

Этот метод можно записать в классе DAO и избежать агрегирования и критериев.

@Query(value = "{ 'dateOfBirthday' : ?0 }")
    public List<User> findUserByDateOfBirthday( String dateOfBirthday);
0 голосов
/ 19 февраля 2019

Я могу обнаружить несколько ошибок в запросе, который вы пытаетесь построить:

  1. Criteria.where принять String, который является ключом пары ключ / значение.Не такой оператор запроса, как $expr
  2. Arrays.asList, возвращает список фиксированного размера, подкрепленный указанным массивом.Он принимает массив, с помощью которого список будет поддерживаться в качестве параметра.Вы передаете String.
  3. Вам не нужно избегать кавычки.Вместо этого вы можете использовать '.

Поскольку $expr не поддерживается весной, пока в обычном запросе вы можете передать запрос json напрямую.

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

Query query = new BasicQuery("{ 
    '$and' : [
        {'$expr' : [{ '$dayOfMonth': '$time_created' } , { '$dayOfMonth': "+ nowAsISO +" }]}, 
        {'$expr' : [ { '$month': '$time_created' } , { '$month': "+ nowAsISO +" }]}, 
        {'$expr' : { '$ne' : [ { '$year': '$time_created' } , { '$year': "+ nowAsISO +" }]}}
    ]
}")
List<Document> results = mongoTemplate.find(query, Document.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...