MongoDb lte / lt查询意外行为

时间:2016-10-18 18:51:15

标签: mongodb

我使用Spring连接到mongoDb。在使用Criteria创建查询时,lt / lte的行为方式不同,即它们提供随机输出。

我想找到" x"英里的邮政编码

查询创建/执行代码:

System.out.println("Please Enter your zipCode");
            String zipCode = br.readLine();
            System.out.println("Enter the distance (miles) to find store");
            Integer distance = br.read();

            Query query = new Query();
            query.addCriteria(Criteria.where("storeDistance").lt(distance).and("storezipCode").is(zipCode));

            List<Store>storeList = mongoOperation.find(query, Store.class);

            if(storeList.isEmpty()){
                System.out.println("Oops...no store found nearby...!!");
            }else{
                for(int idx=0; idx<storeList.size(); idx++){
                    System.out.println(storeList.get(idx).storeIdentificationumber+"\t"+storeList.get(idx).storeDistance);
                }
            }

商店模型类

package com.storeApp.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection= "stores")
public class Store {

    @Id
    public String storeIdentificationumber;

    public String storeName;
    public String storezipCode;
    public String storeCity;
    public Integer storeDistance;

    public Store(){}

    public Store(String id, String name, String city, String zipCode, Integer distance){
        this.storeIdentificationumber = id;
        this.storeName = name;
        this.storezipCode = zipCode;
        this.storeCity = city;
        this.storeDistance = distance;
    }
}

数据库中的条目:

{
        "_id" : "store1",
        "storeName" : "store One",
        "storezipCode" : "123",
        "storeCity" : "city",
        "storeDistance" : 51
}
{
        "_id" : "store03",
        "storeName" : "Store Three",
        "storezipCode" : "123",
        "storeCity" : "city",
        "storeDistance" : 54
}

输入:

Welcome to Store Application....!!
Please select choice from menu below
1. Add a Store
2. Find a Store
3. Remove a Store
2
Please Enter your zipCode
123
Enter the distance (miles) to find store
50

预期产出:

Oops...no store found nearby...!!

实际输出:

store1  51

根据标准和数据库,应该没有距离小于50英里的商店,但仍然会返回一条记录。

2 个答案:

答案 0 :(得分:1)

问题在于Integer distance = br.read();假设br是BufferedReader的实例。 read方法只读取一个字符并给出该字符的整数值。您可以通过打印distance变量进行验证。

您需要使用readLine并使用Integer.parseInt

转换字符串编号

答案 1 :(得分:0)

是的,这有点奇怪,事情是如果你想在你的查询中添加多个选项,你应该继续添加标准,一个标准不能占用多个字段。

在你的情况下,storezipCode正在从Criteria主要字段中删除storeDistance。

试试这个

config.extraAllowedContent = 'a[*]';

所以问题在于你将使用什么样的场景&#39;和#,你需要留意一些例子,但它并没有像我们希望的那样工作。