MongoDB 查询或条件 Spring 数据

MongoDB Query Or Condition Spring Data

我有 status 集合,其中有四个字段 abc, xyz, status, time

我想为以下 MySql 查询创建 MongoDB 查询:

select * from status where abc = false and xyz = true and (status = pending or (status = inprogress and time = "2015-08-04"))

基本上status可以是pending或者inprogress但是如果是inprogress那么time就必须要比较了。

我尝试创建以下 MongodDB 查询,但没有成功

db.status.find
{   
    "abc" : false , 
    "xyz" : true , 
    "status" : "pending" , 
    "$and" : [ 
    { "status" : "inprogress"} , 
    { "time" : { "$eq" : { "$date" : "2015-08-04"}}}
    ]
}

我正在使用 Spring MongoDB,如果有人可以指导我如何在 Spring 数据 MongoDb.

中创建它,我将不胜感激

谢谢

您正在尝试的当前查询存在一些问题。首先要了解的是,除非另有说明,否则所有操作都是隐式的和 "AND" 条件。因此,您在此处缺少的 $or 条件必须包含状态测试的 "both" 和其他组合 "time" 条件,如下所示:

db.status.find({   
    "abc" : false, 
    "xyz" : true, 
    "$or" : [ 
        { "status" : "pending" },
        { 
           "status" : "inprogress"
           "time" : "2015-08-04"
        }
    ]
})

你的 SQL 表示在这里也意味着 "time" 实际上是一个字符串。如果它以相同的方式存储在您的 MongoDB 文档中,那么上面的内容就可以了。如果不是,并且这些值已转换为 BSON 中的实际 Date 对象,那么您必须提供一个 BSON 日期(或转换的日期)作为参数。通常日期不是 "exact",因此您使用 "range" 代替:

db.status.find({   
    "abc" : false, 
    "xyz" : true, 
    "$or" : [ 
        { "status" : "pending" },
        { 
           "status" : "inprogress"
           "time" : { "$gte": new Date("2015-08-04"), "$lt": new Date("2015-08-05") }
        }
    ]
})

spring 翻译为:

Query query = new Query(Criteria.where("abc").is(false)
    .and("xyz").is(true)
    .orOperator(
        Criteria.where("status").is("pending"),
        Criteria.where("status").is("inprogress")
            .and("time").is("2015-08-04")
    )
);

或使用真实日期对象和范围:

DateTime startDay = new DateTime(2015, 8, 4, 0, 0, DateTimeZone.UTC);
Date startDate = startDay.toDate();
Date endDate = startDay.plusDays(1).toDate();

Query query = new Query(Criteria.where("abc").is(false)
    .and("xyz").is(true)
    .orOperator(
        Criteria.where("status").is("pending"),
        Criteria.where("status").is("inprogress")
            .and("time").gte(startDate).lt(endDate)
    )
);

至少从记忆中应该是正确的,因为现在远离 IDE。另请注意此处运算符的 "chaining",例如 $gte and $lt 也意味着 "AND" 条件分配给同一键的值。

在处理日期时,底层驱动程序希望所有与 BSON 日期匹配的输入都被转换为 java.util.Date 类型,无论您如何实例化日期。