【问题标题】:MongoDB - Negate $elemMatch queryMongoDB - 否定 $elemMatch 查询
【发布时间】:2015-06-25 11:37:18
【问题描述】:

拥有这个称为住宿的文档集合...

[{
    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”预订,则预期结果应该是该住宿。这意味着在预订日期用户应该能够要求预订住宿(可能在双方都应该同意的某些条件下)。

【问题讨论】:

  • 如果您只想找出给定日期范围内的status:ON_REQUEST,为什么还要检查$not,那么为什么要使用$not
  • 贴出对伤口有帮助的预期结果
  • @yogesh 与 $elemMatchstatus:ON_REQUEST 一直给出误报,因为我没有检查搜索日期中是否存在其他可能状态的其他预订。除status:ON_REQUEST以外的预订,住宿一律不退。
  • @YagoQuinoy 为什么你不能改变设计,我觉得这是一个糟糕的设计,因为你可能必须在 bookings 数组中嵌入另一个数组。请考虑这个场景假设您需要添加 CONFIRMED booking 的用户信息,它由姓名、地点、多个地址、电话号码(数组)等组成。因此更新嵌套数组很繁琐
  • @YagoQuinoy 你不能把整个$elemMatch 换成status: ON_REQUEST 吗?

标签: mongodb


【解决方案1】:

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

因此,最后,要知道是否有住宿,我必须先获取所有住宿,获取他们的 ID,然后获取满足搜索条件的所有预订并执行一些逻辑。

很遗憾,我无法仅通过一个查询来实现,但预订子文档确实会增长很多,并且将其放在住宿内会很痛苦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    相关资源
    最近更新 更多