5

これは、Java ドライバーで Mongodb を使用する最初のショットです。javascript と Date() オブジェクトを使用してコマンド ラインからデータベースにクエリを実行できますが、ドライバーの使用に問題があります。私のクエリに基づいて、誰が問題が何であるかを見ることができますか? ありがとう

            Date current = new Date();
            DBCollection coll = db.getCollection("messages");

            BasicDBObject query = new BasicDBObject("created_on", new BasicDBObject("$gte", new Date(current.getYear(), current.getMonth(), current.getDate())).
                    append("created_on", new BasicDBObject("$lt", new Date(current.getYear(), current.getMonth() - 1, current.getDate()))));

            System.out.println("Query: " + query);


            DBCursor cursor = coll.find(query);

クエリ: { "created_on" : { "$gte" : { "$date" : "2012-12-06T05:00:00.000Z"} , "created_on" : { "$lt" : { "$date" : " 2012-11-06T05:00:00.000Z"}}}}

PS 明らかでない場合は、先月のすべてのレコードを検索しようとしています。

4

4 に答える 4

16

クエリを間違って作成しているようです。以下をお試しください。

BasicDBObject query = new BasicDBObject("created_on", //
                      new BasicDBObject("$gte", new DateTime().toDate()).append("$lt", new DateTime().toDate()));

Datetimeobject は、Java での日付操作を簡素化するライブラリです。あなたはそれをチェックすることができます。 http://joda-time.sourceforge.net/

また、morphia は、Java ドライバーを介して mongodb を操作するための優れた Java オブジェクト ドキュメント マッパー (ODM) フレームワークです。これにより、Java を介したクエリが簡素化されます。

https://github.com/jmkgreen/morphia

于 2013-01-03T14:28:27.620 に答える
3

created_on出力されたクエリに基づいて、という名前の子を持つフィールドを持つドキュメントを探していますcreated_on。そのような文書は存在しないと思います。つまり、クエリの形式が正しくありません。

クエリ オブジェクトは次のようになります。

BasicDBObject dateRange = new BasicDBObject ("$gte", new Date(current.getYear(), current.getMonth(), current.getDate());
dateRange.put("$lt", new Date(current.getYear(), current.getMonth() - 1, current.getDate());

BasicDBObject query = new BasicDBObject("created_on", dateRange);

また、サイドバーとして、java.util.Dateクラスの 3 つの引数のコンストラクターは非推奨であるため、おそらく使用を避ける必要があります。MongoDB Java ドライバーで日付を操作するときは、通常、java.util.CalendarクラスとそのgetTime()メソッドを使用します。

于 2012-12-06T21:29:20.397 に答える
1

以前にmongo用のJavaドライバーを使用したことがありませんが、作成したクエリが正しくないようです。

Query: { "created_on" : { "$gte" : { "$date" : "2012-12-06T05:00:00.000Z"} , "created_on" : { "$lt" : { "$date" : "2012-11-06T05:00:00.000Z"}}}}

実際、クエリは次のようになります。

Query: { "created_on" : {$gte: start, $lt: end}}

start と end は日付です。「created_on」を 2 回目に参照するのは不要なようで、実際にはクエリが壊れている可能性があります。

注: この理論をテストする機会はありませんでしたが、http://cookbook.mongodb.org/patterns/date_range/から作業しており、目前の質問に非常に関連しているようです。

于 2012-12-13T23:28:22.840 に答える
1

Jodatime lib は非常に便利です。DateTime のタイムゾーン パラメータには DateTimeZone.UTC を使用してください。タイムゾーンを設定すると、正確な結果が得られます。これを試して

    Calendar cal = Calendar.getInstance();
    //get current year,month & day using Calender
    int year=cal.get(Calendar.YEAR);
    int monthNumber=cal.get(Calendar.MONTH);
    int dateNumber=cal.get(Calendar.DAY_OF_MONTH);
    monthNumber+=1;


    BasicDBObject query = new BasicDBObject("dateCreated",new BasicDBObject("$gte", new DateTime(year, monthNumber, dateNumber, 0, 0,DateTimeZone.UTC).toDate()).append("$lte",new DateTime(year, monthNumber, dateNumber, 23, 59,DateTimeZone.UTC).toDate()));

    System.out.println("formed query: "+query);

    DBCursor cursor = collection.find(query);
    while(cursor.hasNext())
    {
        System.out.println("found doc in given time range: "+cursor.next().toString());
    }
于 2014-11-25T13:32:22.993 に答える