首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB -否定$elemMatch查询

MongoDB -否定$elemMatch查询
EN

Stack Overflow用户
提问于 2015-06-25 19:37:19
回答 1查看 1.3K关注 0票数 1

有了这个叫做住宿的文档集合...

代码语言:javascript
复制
[{
    name: String,
    bookings: [{
        from: Date
        to: Date
        status: String //'CONFIRMED', 'ON_REQUEST', 'PAID'
    }]
}]

我想要查找所有在给予日期之间没有任何预订的住宿,除了那些具有'ON_REQUEST‘的预订。

代码语言:javascript
复制
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总是匹配结果。

代码语言:javascript
复制
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‘预订,那么预期的结果应该是住宿。这意味着在预订日期中,用户应该能够要求预订住宿(可能在某些双方都应该同意的条件下)。

EN

回答 1

Stack Overflow用户

发布于 2015-06-25 22:25:44

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

因此,最后,为了知道是否有住宿可用,我必须首先获得所有住宿,获得他们的if,然后获得满足搜索条件的所有预订,并执行一些逻辑。

令人遗憾的是,我不能只用一个查询就能实现,但确实,booking子文档将会增长很多,将其放在住宿中将是一件痛苦的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31049274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档