我有一个包含以下格式文档的集合:
{
"_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
}
我可以要求mongo返回没有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中使用指定的提示执行查询?
答案 0 :(得分:0)
您可以这样使用:
Query query = new Query();
query.withHint("lastUpdateDate_-1");
mongoTemplate.find(query, SomeClass.class);
方法withHint
的参数是索引名称;
索引名称应该是数据库中的索引名称,而不是列名称,而不是您编写时的json字符串;