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