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 类型,无论您如何实例化日期。
我有 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 类型,无论您如何实例化日期。