2017-08-16 17 views
0

SQLクエリ=>私はMongoDBのを使って、このクエリをretriveしたいANDのやり方ANDの中で?

where and ((subtype="dailyMessage" and registDate="today") or(subtype !="dailyMessage")) 

私はこのコレクションを持っています。 (今日2017-08-16T15:48:19.947Z 'です)

{ 
    "_id" : ObjectId("597768443b1fd6308c0350c0"), 
    "type" : "message", 
    "subtype" : "dailyMessage", 
    "message" : test1", 
    "registDate" : ISODate("2017-08-16T15:48:19.947Z") 
}, 
{ 
    "_id" : ObjectId("597768443b1fd6308c0350c1"), 
    "type" : "message", 
    "subtype" : "dailyPush", 
    "message" : test2", 
    "registDate" : ISODate("2017-07-25T15:48:19.947Z") 
}, 
{ 
    "_id" : ObjectId("597768443b1fd6308c0350c2"), 
    "type" : "message", 
    "subtype" : "dailyPush", 
    "message" : test3", 
    "registDate" : ISODate("2017-07-24T15:48:19.947Z") 
} 

は、ここに私の問題はどのようにすることができますということです

List<String> listOfmessage = new ArrayList<String>(); 
    listOfSubtype.add("dailyMessage"); 
    criteria = Criteria.where("test").is("james");  
    criteria.andOperator(Criteria.where("registDate").gte(LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT)).lte(LocalDateTime.now()) , Criteria.where("subtype").in(listOfmessage) .orOperator(Criteria.where("subtype").nin(listOfmessage))); 

私のコード(スプリングブートにMongoDB、Javaの8を使用して)でありますandOperatorをandOperatorに挿入しますか?

+0

以下のようにこれを出力すべきクエリを使用して、サンプルドキュメントを表示することができます集約

Query query = new Query(); query.addCriteria ( new Criteria() .andOperator ( Criteria.where("test").is("james"), new Criteria() .orOperator ( Criteria.where("registDate").gte(LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT)).lte(LocalDateTime.now()) .and("subtype").in(listOfMessage), Criteria.where("subtype").nin(listOfMessage) ) ) ); 

下に試すことができますか? – notionquest

+0

私のサンプルコレクションを追加しました – james

+0

あなたのSQLクエリが意味をなさないと思われる.....あなたはAND((条件1 AND条件2)OR(条件3))これだけではないか(条件1 AND条件2)OR条件3 – robjwilkins

答えて

0

コメントの中で述べたように、全体の状態外のandは意味がありません。以下のコードは、以下の条件のために書かれています。

(condition1 AND condition2) OR condition3 

コード: -

あなたの春の構成に基づいてMongoOperationsオブジェクトを取得するには、以下のコードを変更する必要があるかもしれません。

"register"はコレクション名です。コレクション名に応じて適宜変更することができます。

public Boolean getRegisterData() { 

     MongoOperations mongoOperations = getMongoConnection(); 

     List<String> listOfSubType = new ArrayList<String>(); 
     listOfSubType.add("dailyMessage"); 

     List<String> listOfMessage = new ArrayList<String>(); 
     listOfMessage.add("test1"); 

     Criteria criteriaSubTypeAndDate = new Criteria(); 

     criteriaSubTypeAndDate.andOperator(Criteria.where("registDate") 
       .gte(LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT)).lte(LocalDateTime.now()), 
       Criteria.where("subtype").in(listOfSubType)); 

     Criteria criteriaSubType = Criteria.where("subtype").ne("dailyMessage"); 

     Criteria criteriaFull = new Criteria(); 

     criteriaFull.orOperator(criteriaSubTypeAndDate, criteriaSubType); 


     Query query = new Query(); 
     query.addCriteria(criteriaFull); 

     System.out.println(query); 

     mongoOperations.executeQuery(query, "register", new RegistryDocumentCallbackHandler()); 

     return true; 

    } 

結果セットの文書処理クラス: -

processDocument()メソッドは、結果セット内の各ドキュメントに対して実行されます。

public class RegistryDocumentCallbackHandler implements DocumentCallbackHandler { 

    @Override 
    public void processDocument(DBObject dbObject) throws MongoException, DataAccessException { 
     System.out.println("Registry collections data ===>" + dbObject.toString()); 

    } 

} 
+0

ありがとうたくさんあります。あなたは私の一日を節約します – james

+0

助けがあれば親切に回答を受け入れてください。 – notionquest

0

あなたは

{ 
    "$and": [ 
    { 
     "test": "james" 
    }, 
    { 
     "$or": [ 
     { 
      "registDate": { 
      "$gte": { 
       "$date": "2017-08-17T01:05:07.586Z" 
      }, 
      "$lte": { 
       "$date": "2017-08-17T01:05:07.586Z" 
      } 
      }, 
      "subtype": { 
      "$in": [ 
       "dailyMessage" 
      ] 
      } 
     }, 
     { 
      "subtype": { 
      "$nin": [ 
       "dailyMessage" 
      ] 
      } 
     } 
     ] 
    } 
    ] 
} 
関連する問題