【问题标题】:How to find in specific date interval如何在特定日期间隔内查找
【发布时间】:2020-09-18 21:34:21
【问题描述】:

我在 Mongodb 中找不到想要的文档和列表字段的片段。所以我有以下文件:

{
  "_id": "5ed38e5d2a6e74567c7a579c",
  "id": "AAA",
  "events": [
{
  "dayTypeId": "5e71e1918ee9a326ebdf1611",
  "startDate": {
    "$date": "2020-06-01T00:00:00.000Z"
  },
  "endDate": {
    "$date": "2020-06-04T00:00:00.000Z"
  },
  "stared": false,
  "userId": "XXX",
  "mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
},
{
  "dayTypeId": "5e71e1918ee9a326ebdf1611",
  "startDate": {
    "$date": "2020-06-10T00:00:00.000Z"
  },
  "endDate": {
    "$date": "2020-06-10T00:00:00.000Z"
  },
  "stared": false,
  "userId": "XXX",
  "mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
},
{
  "dayTypeId": "5e71d8628ee9a326e7df160d",
  "startDate": {
    "$date": "2020-06-05T00:00:00.000Z"
  },
  "endDate": {
    "$date": "2020-06-09T00:00:00.000Z"
  },
  "stared": false,
  "userId": "XXX",
  "mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
    },
{
  "dayTypeId": "5e71d8628ee9a326e7df160d",
  "startDate": {
    "$date": "2020-07-13T00:00:00.000Z"
  },
  "endDate": {
    "$date": "2020-07-21T00:00:00.000Z"
  },
  "stared": false,
  "userId": "XXXX",
  "mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
    }
  ]
}

我想获取startDateendDate02.06.2020-11.06.2020 范围内的“事件”列表片段。

例如,在我的示例数据中,我希望返回除最后一个元素之外的所有元素。

【问题讨论】:

  • 范围区间的目标是哪个字段:startDateendDate?还是两者兼而有之?
  • 两者。开始日期:2020 年 6 月 2 日,结束日期:2020 年 6 月 11 日。我使用了 $gte 和 $lte 但我没有得到正确的结果。
  • 所以...你的范围区间必须覆盖开始和结束,这意味着 interval_start 是 gte startDate 而 interval_end 是 lte endDate?

标签: database mongodb nosql pymongo


【解决方案1】:

您可以使用$filter 过滤掉任何不符合您条件的事件:

db.collection.aggregate([
    {
        $match: {
            $or: [
                {
                    "events.startDate": {$gte: new Date("2020-06-02"), $lte: new Date("2020-06-11")}
                },
                {
                    "events.endDate": {$gte: new Date("2020-06-02"), $lte: new Date("2020-06-11")}
                }
            ]
        }
    },
    {
        $project: {
           events: {
               $filter: {
                   input: "$events",
                   as: "event",
                   cond: {
                       $or: [
                           {
                               $and: [
                                   {$gte: ["$$event.startDate", new Date("2020-06-02")]},
                                   {$lte: ["$$event.startDate", new Date("2020-06-11")]},
                               ]
                           },
                           {
                               $and: [
                                   {$gte: ["$$event.endDate", new Date("2020-06-02")]},
                                   {$lte: ["$$event.endDate", new Date("2020-06-11")]},
                               ]
                           }
                       ]
                   }
               }
           } 
        }
    }
])

【讨论】:

  • 我的朋友,由于“startDate”和“endDate”位于“events”列表中,此代码无法正常工作。请考虑。
  • 啊,您希望它们在所有文档中匹配吗?是否需要保留文档结构。
  • 我只需要包含所需元素的事件列表。是的,我想检查事件列表中的所有元素
  • 我的朋友你有什么发现吗?
  • 我编辑了答案以使用 $filter,因为事件在数组中。
猜你喜欢
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多