запрос mongodb: результат с условной находкой - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь сделать условный поиск в MongoDB. Дана коллекция со следующими полями:

itemId: Long
itemName: String
unconsumed: Boolean
snooze: Boolean
expiryTs: Long

Я хочу найти все элементы в зависимости от того, являются ли они unconsumed, в зависимости от snooze срок действия должен быть условно оценен, например:

if (snooze)
    expiryTs < now + 1
else
    expiryTs < now + 2

Я использую KMongo для запроса коллекции, но со следующим запросом

collection.find(and(PantryDomain::unconsumed eq true,
                    expr(cond(PantryDomain::snooze eq true,
                              PantryDomain::expiryTs lt Instant.now().plus(1, ChronoUnit.DAYS).toEpochMilli(),
                              PantryDomain::expiryTs lt Instant.now().plus(2, ChronoUnit.DAYS).toEpochMilli()))))

Я получаю эту ошибку:

com.mongodb.MongoQueryException: Query failed with error code 16020 and error message 'Expression $lt takes exactly 2 arguments. 1 were passed in.' on server localhost:27017

Есть идеи, что не так с запросом? Спасибо: -)

1 Ответ

0 голосов
/ 20 января 2019

вы можете попробовать

collection.find(and(PantryDomain::unconsumed eq true,
                    expr(cond(PantryDomain::snooze eq true,
                              lt PantryDomain::expiryTs Instant.now().plus(1, ChronoUnit.DAYS).toEpochMilli(),
                              lt PantryDomain::expiryTs Instant.now().plus(2, ChronoUnit.DAYS).toEpochMilli()))))

вы также можете упростить его как

collection.find(and(PantryDomain::unconsumed,
                    expr(cond(PantryDomain::snooze,
                              lt PantryDomain::expiryTs Instant.now().plus(1, ChronoUnit.DAYS).toEpochMilli(),
                              lt PantryDomain::expiryTs Instant.now().plus(2, ChronoUnit.DAYS).toEpochMilli()))))
...