1

MongoDB から特定の半径内で正しい日付を取得する際に問題が発生しています。一番下にjsonの例があります。私の目標は、定義された位置情報に近いすべてのアイテムを検索し、開始時間でフィルタリングすることです。これには、正しいインデックスの作成も含まれます。現在、多くのガイダンスがありません。助けてくれてありがとう。

要約すると、私がやろうとしていることは次のとおりです。

  • 指定された位置情報から 3 マイル以内にある MongoDB からすべてのアイテムを取得する
  • starttime が x より後で y より前のアイテムの結果をフィルタリングします。
  • クエリで機能するインデックスを作成します。

よろしく、ランス

日付を照会したいだけの場合は、次のことができます。

DateTime maxdateTime = new DateTime(); //Joda Time
//Adjust my datetime, simply add 2 hours to the time
DateTime mindateTime = new DateTime(); Joda Time
//Adjust my datetime, subtract 1 day
Date maxDate = new Date(maxdateTime.getMillis());
Date minDate = new Date(mindateTime.getMillis());

DBCollection coll = db.getCollection("BikeRides");      
coll.ensureIndex( { startTime:1, } )
BasicDBObject query = new BasicDBObject();
query.put("startTime", BasicDBObjectBuilder.start("$gte", minDate).add("$lte", maxDate).get());

DBCursor cursor = coll.find(query);

try {
   while(cursor.hasNext()) {
       System.out.println(cursor.next());
   }
} finally {
   cursor.close();
}

GeoLocation でクエリを実行したいだけの場合は、次のようにできます。

//A GeoLoc is passed into this method
int distance = 3;
int earthRadius = 3963.192;
DBCollection coll = db.getCollection("BikeRides");      
coll.ensureIndex( { Location.GeoLoc : "2d" } )
db.runCommand( { geoNear: "BikeRides",
                 nearSphere: [ "Location.GeoLoc.latitude": geoLoc.longitude, "Location.GeoLoc.longitude": geoLoc.latitude ]
                 maxDistance: distance / earthRadius
               }  )

Jongo でもこれを試みましたが、成功しませんでした。

   DateTime nowDateTime = new DateTime(DateTimeZone.UTC); // Joda time
   DateTime maxStartTime = nowDateTime.plusMinutes(TIME_IN_MINUTES);
   DateTime minStartTime = nowDateTime.minusDays(1); //This will cut out most old bike rides
   Long now = nowDateTime.toInstant().getMillis();
   Long max = maxStartTime.toInstant().getMillis();
   Long min = minStartTime.toInstant().getMillis();
   //Get the objects using Jongo
   MongoCollection bikeRidesCollection =     MongoDatabase.Get_DB_Collection(MONGO_COLLECTIONS.BIKERIDES, "Location.GeoLoc");
   //Currently not placing a limit on this result.  If we find this is an issue we can add later.

   bikeRidesCollection.ensureIndex("{Location.GeoLoc: '2d', RideStartTime: 1}");
   Iterable<BikeRide> all = bikeRidesCollection
          .find("{Location.GeoLoc: {$near: [#, #], $maxDistance: #}, RideStartTime: {$lte: #, $gte: #}}", //, $maxDistance: #
                 location.getGeoLoc().longitude,
                 location.getGeoLoc().latitude,
                 RADIUS_IN_MILES/EarthRadiusInMILES,
                 max ,
                 min )
          .as(BikeRide.class);
   List<BikeRide> closeBikeRides = Lists.newArrayList(all);

私のサンプルJson:

{
  "BikeRides": [
    {
      "StartTime": "2013-03-08T00:01:00.000 UTC",
      "bikeRideName": "Strawberry Ride",
      "id": "513afc2d0364b81b8abfa86e",
      "location": {
        "city": "Portland",
            "geoLoc": {
          "longitude": "-122.71446990966797",
          "latitude": "45.49216842651367"
        },
        "state": "OR",
        "streetAddress": "4214 SE 36th"
      },
      "startTime": "2013-03-07T16:01:00-08:00"
    }
  ]
}
4

1 に答える 1

3

解決しました。Jongo を機能させるには、正しい maxDistance を使用する必要がありました。EarthRadiusInMILES の代わりに、これを定義する必要がありました。ダブル ONE_DEGREE_IN_MILES = 69.11;

注: 緯度 1° = 約 69.11 マイル

于 2013-03-12T19:53:52.717 に答える