MongoDB - 否定$ elemMatch查询

时间:2015-06-25 11:37:19

标签: mongodb

有这个文件集合称为住宿......

[{
    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 个答案:

答案 0 :(得分:0)

正如@ karthick.k建议的那样,我更改了设计,允许'预订'拥有自己的收藏品并从住宿中引用它们。

所以,最后,要知道是否有住宿,我必须先获得所有住宿,获取他们的ID,然后获得符合搜索条件并执行某些逻辑的所有预订。

令人遗憾的是,我只用一个查询就无法实现,但确实预订子文档会增长很多并且将它放在住处内会很痛苦。