MongoDB-否定$elemMatch查询
有一套叫做住宿的文件MongoDB-否定$elemMatch查询,mongodb,Mongodb,有一套叫做住宿的文件 [{ name: String, bookings: [{ from: Date to: Date status: String //'CONFIRMED', 'ON_REQUEST', 'PAID' }] }] 我想找到所有在提供日期之间没有任何预订的住宿,但有“按要求”的预订除外 var searchFrom = new Date(2015, 02, 02); var searchTo = new
[{
name: String,
bookings: [{
from: Date
to: Date
status: String //'CONFIRMED', 'ON_REQUEST', 'PAID'
}]
}]
我想找到所有在提供日期之间没有任何预订的住宿,但有“按要求”的预订除外
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和$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
在这种情况下,预期结果应该是空的,因为在给定日期中有预订,所以我不能预订
如果现有的唯一预订是“按需”预订,那么预期结果应该是该住宿。这意味着在预订日期,用户应该能够要求预订住宿(可能在双方都同意的某些条件下)。正如@karthigh.k所建议的,我改变了设计,允许“预订”拥有自己的收藏,并从住宿中引用它们 因此,在最后,要知道是否有住宿,我必须首先获得所有住宿,获得他们的ID,然后获得所有符合搜索条件的预订,并执行一些逻辑
遗憾的是,我无法仅通过一个查询实现,但预订子文档确实会增长很多,将其放在住宿区内将是一件痛苦的事情。正如@karthigh.k建议的那样,我改变了设计,允许“预订”拥有自己的收藏并从住宿区引用它们 因此,在最后,要知道是否有住宿,我必须首先获得所有住宿,获得他们的ID,然后获得所有符合搜索条件的预订,并执行一些逻辑
遗憾的是,我无法通过一个查询实现,但预订子文档确实会增长很多,将其放在住宿区内将是一件痛苦的事情。如果您只想了解给定日期范围的
状态:按请求,为什么要检查$not
,那么为什么您应该使用$not
?发布预期的结果helpful@yogesh仅使用$elemMatch
forstatus:ON_REQUEST
不断给出假阳性,因为我没有检查搜索日期中是否存在其他可能状态的预订。如果有预订,则不应退还住宿,但状态除外:应请求@YagoQuinoy为什么不能更改设计,我觉得这是一个糟糕的设计,因为您可能必须在预订阵列中嵌入另一个阵列。请考虑这个场景假设您需要添加已确认预订的用户信息,它包括姓名、地点、多个地址、电话号码(数组),所以更新嵌套数组是非常必要的tedious@YagoQuinoy难道你就不能摆脱整个$elemMatch
的状态:ON\u REQUEST
?如果你只想找出给定日期范围的状态:ON\u REQUEST
,为什么要检查$not
,那么为什么您应该使用$not
?发布预期的结果helpful@yogesh仅使用$elemMatch
forstatus:ON_REQUEST
不断给出假阳性,因为我没有检查搜索日期中是否存在其他可能状态的预订。如果有预订,则不应退还住宿,但状态除外:应请求@YagoQuinoy为什么不能更改设计,我觉得这是一个糟糕的设计,因为您可能必须在预订阵列中嵌入另一个阵列。请考虑一下这个场景,假设您需要添加已确认预订的用户信息,它包括姓名、地点、多个地址、电话号码(数组)等。因此更新嵌套数组是非常必要的tedious@YagoQuinoy难道你就不能取消整个$elemMatch
的状态:ON_REQUEST
?