Spring boot mongoDB类查询数字字段整数/双精度

Spring boot mongoDB类查询数字字段整数/双精度,mongodb,spring-boot,Mongodb,Spring Boot,我想在spring boot中对整型/双精度字段进行类似查询。 收藏名称:玩家 { "firstName" : "Lionel", "lastName" : "messi", "team" : "FC Barcelona", "salary" : 40000, "type" : "football" },{ "firstName" : : "Cristiano", "lastName" : "Ronaldo", "team" : "

我想在spring boot中对整型/双精度字段进行类似查询。
收藏名称:玩家

{
    "firstName" : "Lionel",
    "lastName" : "messi",
    "team" : "FC Barcelona",
    "salary" : 40000,
    "type" : "football"
},{
    "firstName" : : "Cristiano",
    "lastName" : "Ronaldo",
    "team" : "Real Madrid C.F.",
    "salary" : 35000,
    "type" : "football"
},{
    "firstName" : : "Neymar",
    "lastName" : "Jr",
    "team" : "Paris Saint-Germain F.C.",
    "salary" : 25000,
    "type" : "football"
},{
    "firstName" : "Luis",
    "lastName" : "Alberto",
    "team" : "FC Barcelona",
    "salary" : 25000,
    "type" : "football"
},{
    "firstName" : "Virat",
    "lastName" : "Kohali",
    "team" : "Indian Cricket Team",
    "salary" : 40000,
    "type" : "cricket"
}
我的SpringJava代码如下,它生成查询

String game = "football";
String team = "barcelona";
Double salary = 250;

Query query = new Query();
Set<String> gameType = new HashSet<>();
List<Criteria> andCriteria = new ArrayList<>();

gameType.add(game);

andCriteria.add(Criteria.where("type").in(gameType));
andCriteria.add(Criteria.where("team").regex(team,"i"));

Criteria[] criteriaArray = new Criteria[andCriteria.size()];
criteriaArray = andCriteria.toArray(criteriaArray);
query.addCriteria(new Criteria().andOperator(criteriaArray));

List<Players> players = mongoTemplate.find(query, Players.class);

return players;
上面的查询为我返回了两个“type”文档,分别是“football”和“team”,比如巴塞罗那

但我想查询“类型”为“足球”和“薪水”如250在它

返回的结果如下

{"firstName" : : "Neymar", "lastName" : "Jr", "team" : "Paris Saint-Germain F.C.", "salary" : 25000, "type" : "football"},
{"firstName" : "Luis", "lastName" : "Alberto", "team" : "FC Barcelona", "salary" : 25000, "type" : "football"}

提前谢谢。

我设法在双字段上构建了类似的查询

Query query = new Query();
Set<String> gameType = new HashSet<>();
List<Criteria> andCriteria = new ArrayList<>();

String game = "football";
int salary = 250;   

gameType.add(game);

andCriteria.add(Criteria.where("type").in(gameType));
andCriteria.add(Criteria.where("$where").is("/^" + salary + ".*/.test(this.salary)"));

Criteria[] criteriaArray = new Criteria[andCriteria.size()];
criteriaArray = andCriteria.toArray(criteriaArray);
query.addCriteria(new Criteria().andOperator(criteriaArray));

List<Players> players = mongoTemplate.find(query, Players.class);

return players;

我希望这会有所帮助。

基于@Rahul Ghadage的回答,我能够让它工作:

query.addCriteria(Criteria.where("$where").is("/" + salary + "/.test(this.salary)"));
请注意,代码示例中的salary是您的Java变量,其中填充了您想要匹配的数字。 第二个salary是mongo结构中字段的名称


在mongo中使用带有用户输入的正则表达式时要小心

Regex处理文本字段。因此,数字字段上没有正则表达式“like”。顺便说一句,使用范围最大值和最小值怎么样?类似于250-250之间(填充零-尽可能多的零,直到最大的双类型值)或将薪资字段存储为字符串类型。我不能使用范围,因为当我键入250时,我希望所有匹配的记录都在250、2500、25000范围内。。等等。甚至因为一些算术运算,我也不能把薪水作为字符串。顺便说一句,谢谢你的评论。还有其他可能的解决办法吗?哦,我明白了。NP您可以通过所有250的组合作为$in标准。我看不到任何其他解决方案。@Sumanth Varada您可以使用“$eq”运算符进行精确匹配。例如db.players.find({salary:{$eq:25000}})@RahulGhadage我正在使用spring数据标准,如下所示。请您纠正以下标准。query.addCriteria(Criteria.where(“slary”)是(工资));
{"firstName" : : "Neymar", "lastName" : "Jr", "team" : "Paris Saint-Germain F.C.", "salary" : 25000, "type" : "football"},
{"firstName" : "Luis", "lastName" : "Alberto", "team" : "FC Barcelona", "salary" : 25000, "type" : "football"}
Query query = new Query();
Set<String> gameType = new HashSet<>();
List<Criteria> andCriteria = new ArrayList<>();

String game = "football";
int salary = 250;   

gameType.add(game);

andCriteria.add(Criteria.where("type").in(gameType));
andCriteria.add(Criteria.where("$where").is("/^" + salary + ".*/.test(this.salary)"));

Criteria[] criteriaArray = new Criteria[andCriteria.size()];
criteriaArray = andCriteria.toArray(criteriaArray);
query.addCriteria(new Criteria().andOperator(criteriaArray));

List<Players> players = mongoTemplate.find(query, Players.class);

return players;
Query query = new Query();
Set<String> gameType = new HashSet<>();
        
String game = "football";
int salary = 250;
        
gameType.add(game);
        
query.addCriteria(Criteria.where("type").in(gameType));
query.addCriteria(Criteria.where("$where").is("/^" + salary + ".*/.test(this.salary)"));

List<Players> players = mongoTemplate.find(query, Players.class);

return players; 
db.players.find({
  $and: [{
      "type": {
        $in: ["football"]
      }
    },
    {
      $where : "/^250.*/.test(this.salary)"
    }]
})     
query.addCriteria(Criteria.where("$where").is("/" + salary + "/.test(this.salary)"));