Невозможно использовать подсказку запроса с Spring Data MongoDB - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть коллекция, которая содержит документы в следующем формате:

{
    "_id" : "id1",
    "closedAt" : ISODate("2019-04-01T15:19:34.189Z"),
    "attempts" : [{
            "successful" : false
        }],
    "version" : 1,
}

, где closedAt является необязательным и может отсутствовать. У меня также есть индекс, определенный следующим образом:

{
    "v" : 2,
    "key" : {
        "closedAt" : 1,
        "attempts.successful" : 1
    },
    "name" : "closed_at_and_attempts_successful_idx",
    "ns" : "x",
    "sparse" : true
}

Я могу попросить Монго вернуть документы, которые не имеют поля closedAt и имеют попытки, где successful равен false, с подсказкой использовать индекс closed_at_and_attempts_successful_idx:

db.x.find({"$and": [{ "closedAt" : {"$exists":false}}, {"attempts.successful" : {"$all" : [false]}}]}).hint("closed_at_and_attempts_successful_idx")

Это возвращает мне правильные результаты в консоли MobgoDB. Однако я использую Spring Boot 2.1 и Spring Data MongoDB (реактивный), и мне не удается преобразовать это для использования из Spring. Я пробовал множество подходов, например:

val document = Document.parse("{'\$and' : [{'attempts.successful' : {'\$eq' : false}},{'\$nor' : [{'closedAt' : {'\$exists' : true}}]}]}")
val query = BasicQuery(document).withHint("{ 'closed_at_and_attempts_successful_idx' : 1 }")
return mongoReactiveOperations.find(query, X::class.java). ..

и

val q: Bson = and(Arrays.asList(exists("closedAt", false), all("chargingAttempts.successful", Arrays.asList(false))))
return mongo.getCollection("x").find(q).hint("closed_at_and_attempts_successful_idx").toFlux().map { source ->
    mongo.converter.read(X::class.java, source)
}. ..

но все мои попытки заканчиваются неудачей:

com.mongodb.MongoQueryException: Query failed with error code 2 and error message 'error processing query: ns=order.order batchSize=256Tree: $and
    attempts.successful $eq false
    $not
        closedAt exists
Sort: {}
Proj: {}
 planner returned error: bad hint' on server localhost:27017

Кажется, это работает, если я уберу подсказку запроса.

В: Как мне выполнить мой запрос с указанным указанием в Spring Data MongoDB?

1 Ответ

0 голосов
/ 15 июля 2019

вы можете использовать так:

Query query = new Query();
query.withHint("lastUpdateDate_-1");
mongoTemplate.find(query, SomeClass.class);

аргумент метода withHint - это имя индекса;

имя индекса должно быть именем индекса в вашей базе данных, а неимя столбца, а не строка json, как вы пишете;

...