如何在AND内部进行OR?

时间:2017-08-16 09:16:43

标签: mongodb mongodb-query spring-data-mongodb

SQL查询=>

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

我想使用mongodb来检索此查询。

我有这个系列。 (今天是'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")
}   

这是我的代码(spring boot mongodb,使用java 8)

    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)));

我的问题是如何在andOperator上插入orOperator?

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,整个条件之外的and没有意义。以下代码是针对以下条件编写的。

(condition1 AND condition2) OR condition3

<强>代码: -

您可能需要根据Spring配置更改以下代码以获取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());

    }

}