有这个文件集合称为住宿......
[{
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'预订,预期结果应该是住宿。这意味着在预订日期,用户应该能够要求预订住宿(可能在两个部分应该同意的某些条件下)。
答案 0 :(得分:0)
正如@ karthick.k建议的那样,我更改了设计,允许'预订'拥有自己的收藏品并从住宿中引用它们。
所以,最后,要知道是否有住宿,我必须先获得所有住宿,获取他们的ID,然后获得符合搜索条件并执行某些逻辑的所有预订。
令人遗憾的是,我只用一个查询就无法实现,但确实预订子文档会增长很多并且将它放在住处内会很痛苦。