2016-10-18 9 views
0

Springを使用してmongoDbに接続しました。 Criteriaを使用してクエリを作成している間、lt/lteはランダムな出力を与えるような動作をしません。MongoDb lte/lt queryが予期しない動作をする

私は郵便番号

クエリの作成/実行コードの "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マイルで何の店があってはなりませんそれでも1つのレコードが返されます。

答えて

1

問題はInteger distance = br.read();であると仮定します。brはBufferedReaderのインスタンスです。 readメソッドはただ一つの文字を読み、その文字の整数値を返します。変数distanceを印刷して確認できます。

あなたはそれが働いていた... readLineを使用してInteger.parseInt

+0

感謝を使用して文字列の数を変換する必要があります。 – anukuls

0

ええ、ちょっと変わったことですが、クエリに複数のオプションを追加する場合は、条件を追加したままにする必要があります.1つの条件で複数のフィールドを取ることはできません。

あなたのケースでは、storezipCodeはCriteriaチーフフィールドからstoreDistanceを削除しています。

そこで問題は、あなたが使用するどのようなシナリオである「と」、あなたが例に目を光らせする必要がありますが、それは我々はそれが仕事をしたいように動作しません。この

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

をお試しください