【问题标题】:Get number of reservation based on dates根据日期获取预订数量
【发布时间】:2019-06-14 17:25:06
【问题描述】:

如果我将 from 传递为“1970-01-01”并将 to 传递为“1970-01-05”,我如何获取预订总数? p>

Reserved 数组包含所有预订的房间,日期为 fromto 日期

这是我的数据:

[
  {
    "_id": "5c0a17013d8ca91bf4ee7885",
    "name": "ABC",
    "reserved": [
      {
        "from": "1970-01-01",
        "to": "1970-01-02",
        "isCompleted": false
      },
      {
        "from": "1970-01-03",
        "to": "1970-01-05",
        "isCompleted": false
      },
      {
        "from": "2017-04-18",
        "to": "2017-04-23",
        "isCompleted": false
      },
      {
        "from": "2018-01-29",
        "to": "2018-01-30",
        "isCompleted": false
      }
    ]
  }
]

我尝试使用 find 查询获取数据(我知道这是不正确的)

db.collection.find({
  reserved: {
    $not: {
      $elemMatch: {
        from: {
          $lt: "1970-01-07"
        },
        to: {
          $gt: "1970-01-05"
        },
        "isCompleted": true
      }
    }
  }
})

【问题讨论】:

  • 您正在尝试的查询是什么?
  • @RaviKumarGupta 我会更新我的代码。很抱歉给您带来不便
  • @RaviKumarGupta 我已经更新了我的问题。

标签: node.js mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

创建一个在过滤数组上使用$size 运算符的管道。对于过滤,您需要 $filter 运算符,您的条件将是 $gte$lte 上的 AND 比较运算符,即

{ 
    "$and": [
        { "$gte": [ < from field >, "1970-01-01"] },
        { "$lte": [ < to field >, "1970-01-05"] }
    ]
}

因此,您的整体聚合操作将类似于以下内容:

db.collection.aggregate([
    { "$addFields": {
        "totalBookings": {
            "$size": {
                "$filter": {
                    "input": "$reserved",
                    "cond": {
                        "$and": [
                            { "$gte": ["$$this.from", "1970-01-01"] },
                            { "$lte": ["$$this.to", "1970-01-05"] }
                        ]
                    }
                }                
            }
        }
    } }
])

【讨论】:

  • 如何修改此查询以获得唯一的预订柜台?就像如果我从日期传递为“1970-01-01”到日期为“1970-01-05”,那么它只会返回我 1。因为有两个预订但那是在不同的日期(一个是从 1970-01 -01 到 1970-01-02,另一个是从“1970-01-03”到“1970-01-05”)。
  • @HarshPatel 这是否回答了您最初的问题?在 SO 上,这被认为是不好的做法,并且非常误导那些过来并看到提供的答案与您所要求的不匹配的人。这里的一般情况是一问一答。我很乐意回答这个附加问题,但应该完全是另一个问题
  • 是的,这是这个问题的答案,在你告诉我之前我就知道了。带来不便敬请谅解。这是新的question
  • 我仍在寻找解决方案。请帮帮我。
【解决方案2】:

基本上,您需要检查这些时间跨度是否相互重叠,这意味着 reserved.from &lt;= toreserved.to &gt;= from。要轻松处理嵌套数组,您可以从$unwind 开始,然后使用$count 获取匹配文档的总数,尝试:

var from = "1970-01-01";
var to = "1970-01-05";

db.collection.aggregate([
    { $unwind: "$reserved" },
    {
        $match: { "reserved.from": { $lte: to }, "reserved.to": { $gte: from  } }
    },
    {
        $count: "total"
    }
])

【讨论】:

  • @mickl,日期是字符串格式,$lte, $gte 可以吗?
  • 如何修改此查询以获得唯一的预订柜台?就像如果我从日期传递为“1970-01-01”到日期为“1970-01-05”,那么它只会返回我 1。因为有两个预订但那是在不同的日期(一个是从 1970-01 -01 到 1970-01-02,另一个是从“1970-01-03”到“1970-01-05”)。
  • 这是新的question 请在那里回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
相关资源
最近更新 更多