【问题标题】:MongoDB Aggregation $match for double nested Object双重嵌套对象的MongoDB聚合$匹配
【发布时间】:2020-08-05 20:18:20
【问题描述】:

我尝试按日期查询我的事件。所以每个事件都有开始日期和结束日期。

这些事件所在的集合的结构如下:

 {
    "_id": "5f2a7feae0c4e10017308fe5",
    "events": [
        {
            "_id": "5f2a802ce0c4e10017308fe8",
            "end": {
                "dateTime": "2020-08-05T23:46:00.000Z"
            },
            "start": {
                "dateTime": "2020-08-05T22:46:00.000Z"
            }
        }, ...
    ]
}

所以我尝试了以下聚合方法:

startend 值是 ISO 字符串,在我的例子中是一年的开始和结束。

   Collection.aggregate([
    { $match: {owner: owner_id}},
    {$unwind: '$events'},
    {  $match : 
      { 'events.start.dateTime': 
        {$gte: start, 
        $lt: end
        }
      }
    }, 
    {$sort: {'events.start.dateTime': 1}}, 
    {$group: {_id: '$_id', 'events': {$push: '$events'}}}
])

当我尝试使用 $match 过滤器时,我得到一个空数组。但是,如果我在没有 $match 过滤器的情况下尝试它。我从集合中取回所有事件。

有人知道问题出在哪里吗?

【问题讨论】:

  • 你可以直接在 $match 中匹配检查这个mongoplayground.net/p/y135h4tmLvR 并且不需要 $unwind 和 $group
  • @turivishal 我用下面的 $match 查询试过了,但还是不行。
  • { $match: { $and: [ {owner: owner_id}, { 'events.start.dateTime': {$gte: start, $lt: end } ] } },跨度>
  • 所以你已经在控制台中检查了你的输入变量值是否正确。我在您的问题中看不到您提供的文档中的所有者字段
  • 那么我认为使用ISODate 函数将startend 变量转换为日期应该可以为您解决问题。 stackoverflow.com/questions/31071999/date-comparison-in-mongodb/…

标签: node.js database mongodb backend


【解决方案1】:

实际上 new Date('2020-06-17T10:03:46.000Z') 对我有用。

所以我的查询如下所示:

Collection.aggregate([
    { $match: { $and: [ {owner: owner_id}, { 'events.start.dateTime': {"$gte": new Date(start), "$lt": new Date(end) } } ] } },
    {$unwind: '$events'}, 
    {$sort: {'events.start.dateTime': 1}}, 
    {$group: {_id: '$_id', 'events': {$push: '$events'}}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2014-03-04
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2022-01-22
    相关资源
    最近更新 更多