Spring MongoDB 使用 or 运算符查询和文本搜索

Spring MongoDB query with or operator and text search

如何使用 Spring 条件构建此 MongoDB 查询?

{
  $or: [
    { "$text" : { "$search" : "570-11024" } },
    {"productDetails.code": "572-R110"}
  ]
}

它将全文索引搜索与带有 orOperator 的普通 Where 条件相结合。

查询的 orOperator(Criteria... criteria) 方法只接受 Criteria 而没有 TextCriteria 也没有 CriteriaDefinition 接口。

是的,你是对的,在 spring 数据中 mongo 你可以这样做,

final TextCriteria textCriteria = TextCriteria.forDefaultLanguage().matchingAny("570-11024");
final DBObject tc = textCriteria.getCriteriaObject();
final Criteria criteria = Criteria.where("productDetails.code").is("572-R110");
final DBObject co = criteria.getCriteriaObject();

BasicDBList or = new BasicDBList();
or.add(tc);
or.add(co);

DBObject qq = new BasicDBObject("$or", or);
// Use MongoTemplate to execute command
mongoTemplate.executeCommand(qq);

是的,您目前无法使用 Query 的 orOperator 方法来组合 Criteria 和 TextCriteria。解决方法包括将 Criteria 和 TextCriteria 对象都转换为其文档表示形式,将其添加到 BasicDbList,然后再转换回“$or”Criteria 对象。

TextCriteria textCriteria = TextCriteria.forDefaultLanguage().matchingAny("570-11024");
Criteria criteria = Criteria.where("productDetails.code").is("572-R110");

BasicDBList bsonList = new BasicDBList();
bsonList.add(criteria.getCriteriaObject());
bsonList.add(textCriteria.getCriteriaObject());

Query query = new Query();
query.addCriteria(new Criteria("$or").is(bsonList));
mongoTemplate.find(query, YourEntity.class);

PS:有人在 spring-data-mongodb 仓库中提出了这个问题,并提出了修复建议 将 orOperator 的参数类型从 Criteria 更改为 CriteriaDefinition。

https://github.com/spring-projects/spring-data-mongodb/issues/3895.