有了这个叫做住宿的文档集合...
[{
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‘预订,那么预期的结果应该是住宿。这意味着在预订日期中,用户应该能够要求预订住宿(可能在某些双方都应该同意的条件下)。
发布于 2015-06-25 22:25:44
正如@karthick.k建议的那样,我改变了设计,允许“预订”拥有自己的集合,并从住宿中引用它们。
因此,最后,为了知道是否有住宿可用,我必须首先获得所有住宿,获得他们的if,然后获得满足搜索条件的所有预订,并执行一些逻辑。
令人遗憾的是,我不能只用一个查询就能实现,但确实,booking子文档将会增长很多,将其放在住宿中将是一件痛苦的事情。
https://stackoverflow.com/questions/31049274
复制相似问题