5
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

public class CustomQuery {

  @Autowired private MongoOperations mongoOperations;    

  public void customQuery(Date submittalDate) {

     List<Question> q1s = mongoOperations.find(
        new Query(Criteria.where("category").is("New")), 
        Question.class);

     List<Question> q2s = mongoOperations.find(
      new Query(
        Criteria.where("submittalDate").gt(submittalDate).and("category").is("New")
      ),
      Question.class);
  }
}

一番上の Spring Java MongoDB クエリは、期待される結果を に返しますq1s

下部のクエリは、上部のクエリのサブセットを返す必要があります。代わりに、「新規」カテゴリにあるかどうかに関係なく、一致するレコードが("submittalDate").gt(submittalDate)結果に含まれます。q2s

つまりand("category").is("New")、2 番目のクエリが無視されているようです。

Spring Data で Mongodb バージョン v2.0.6 32 ビットを使用する。

助けていただければ幸いです。

2012 年 5 月 9 日更新

それでもうまくいかない

2012 年 8 月 26 日更新

これにより、Mongo コマンドラインで結果が返されます。

db.foo.find( {   "submittalDate":{ "$gte": ISODate("2012-07-31T23:00:00.000Z")  }, "category" : "New"    } )

対照的に、Java コード (同じ日付パラメーター用) は機能しません。比較のために、Java から DEBUG によってログに記録されたクエリは次のとおりです。

[DEBUG] [http-8080-1] (MongoTemplate.java:doFind:1256) find using query: 
{ "submittalDate" : { "$gte" : { "$date" : "2012-07-31T23:00:00.000Z"}} , "category" : "New"} 

はい、ログには日付文字列が記録されますが、Mongo シェルを機能させるには ISODate(..) を使用する必要がありました。しかし、私は MongoDB Java ドライバーを java.util.Date の受け入れられたタイプで使用しています - どうすれば ISODate(..) が問題にならないのでしょうか? 問題には別の原因がある可能性があります。

4

2 に答える 2

1

私は春の専門家ではありませんが、インポートの一部が互いに競合しているようです。私が見たドキュメントを考えると、どこで間違っているのかを正確に診断することは困難です。これにSpringフレームワークを使用しない場合、代替/より一般的なアプローチは以下になります。

import com.mongodb.Mongo;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.DBCursor;

public class CustomQuery {

public void customQuery(Date submittalDate)
{
        document = new BasicDBObject();
        document.put(("submittalDate").greaterThanEquals(submittalDate).put("category").is("New").get());
        DBCursor cursor = getDbCollection().find(document); 

}

}
于 2012-08-20T21:08:57.040 に答える
0
{ "$date" : "2012-07-31T23:00:00.000Z"}

に等しい

Date("2012-07-31T23:00:00.000Z")

Date("2012-07-31T23:00:00.000Z")ISODate() ではなく文字列を返します。

http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON経由。

のバグだと思いますorg.springframework.data.mongodb.core.query.Criteria

于 2012-11-01T08:23:58.710 に答える