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
for
status:ON_REQUEST
不断给出假阳性,因为我没有检查搜索日期中是否存在其他可能状态的预订。如果有预订,则不应退还住宿,但
状态除外:应请求
@YagoQuinoy为什么不能更改设计,我觉得这是一个糟糕的设计,因为您可能必须在预订阵列中嵌入另一个阵列。请考虑这个场景假设您需要添加已确认预订的用户信息,它包括姓名、地点、多个地址、电话号码(数组),所以更新嵌套数组是非常必要的tedious@YagoQuinoy难道你就不能摆脱整个
$elemMatch
状态:ON\u REQUEST
?如果你只想找出给定日期范围的
状态:ON\u REQUEST
,为什么要检查
$not
,那么为什么您应该使用
$not
?发布预期的结果helpful@yogesh仅使用
$elemMatch
for
status:ON_REQUEST
不断给出假阳性,因为我没有检查搜索日期中是否存在其他可能状态的预订。如果有预订,则不应退还住宿,但
状态除外:应请求
@YagoQuinoy为什么不能更改设计,我觉得这是一个糟糕的设计,因为您可能必须在预订阵列中嵌入另一个阵列。请考虑一下这个场景,假设您需要添加已确认预订的用户信息,它包括姓名、地点、多个地址、电话号码(数组)等。因此更新嵌套数组是非常必要的tedious@YagoQuinoy难道你就不能取消整个
$elemMatch
状态:ON_REQUEST