【发布时间】:2015-06-25 11:37:18
【问题描述】:
拥有这个称为住宿的文档集合...
[{
name: String,
bookings: [{
from: Date
to: Date
status: String //'CONFIRMED', 'ON_REQUEST', 'PAID'
}]
}]
我想查找在提供日期之间没有任何预订的所有住宿,但具有“ON_REQUEST”的预订除外。
var searchFrom = new Date(2015, 02, 02);
var searchTo = new Date(2015, 02, 05);
{
name: 'My awesome accommodation',
bookings: [
{
from: Date(2015, 02, 01),
to: Date(2015, 02, 03),
status: 'CONFIRMED',
}, {
from: Date(2015, 02, 04),
to: Date(2015, 02, 07),
status: 'ON_REQUEST'
}, {
from: Date(2015, 02, 08),
to: Date(2015, 02, 10),
status: 'PAID'
}]
}
我正在尝试这个,但 $elemMatch 条件不会丢弃不允许的预订,如果我否定 $elemMatch 它会一直给我结果,因为这两个 $elemMatch 将始终匹配结果。
db.accommodations.find({
'bookings': {
$and: [{
$elemMatch: {
'from': {$lte: searchTo},
'to': {$gte: searchFrom},
'status': 'ON_REQUEST'
}
}, {
$not: {
$elemMatch: {
'from': {$lte: searchTo},
'to': {$gte: searchFrom},
'status': {$in: ['CONFIRMED', 'PAID']
}
}
}]
}
});
我想知道如何通过一个查询来解决这个问题,并避免在查询之前开发一些逻辑。
编辑:@karthick.k
在这种情况下,预期的结果应该是空的,因为在给定日期有预订,所以,我应该不能预订。
如果现有的唯一预订是“ON_REQUEST”预订,则预期结果应该是该住宿。这意味着在预订日期用户应该能够要求预订住宿(可能在双方都应该同意的某些条件下)。
【问题讨论】:
-
如果您只想找出给定日期范围内的
status:ON_REQUEST,为什么还要检查$not,那么为什么要使用$not? -
贴出对伤口有帮助的预期结果
-
@yogesh 与
$elemMatch为status:ON_REQUEST一直给出误报,因为我没有检查搜索日期中是否存在其他可能状态的其他预订。除status:ON_REQUEST以外的预订,住宿一律不退。 -
@YagoQuinoy 为什么你不能改变设计,我觉得这是一个糟糕的设计,因为你可能必须在 bookings 数组中嵌入另一个数组。请考虑这个场景假设您需要添加 CONFIRMED booking 的用户信息,它由姓名、地点、多个地址、电话号码(数组)等组成。因此更新嵌套数组很繁琐
-
@YagoQuinoy 你不能把整个
$elemMatch换成status: ON_REQUEST吗?
标签: mongodb