是否可以对聚合管道中的每个文档应用不同的聚合投影?

时间:2020-05-14 18:57:11

标签: mongodb mongoose aggregation-framework

考虑此收藏集:

[
  {
    id: 1,
    nest: [
      object: {
        date: '2020-04-19T00:00:00.000Z'
      },
      object: {
        date: '2020-04-20T00:00:00.000Z'
      },
      object: {
        date: '2020-04-21T00:00:00.000Z'
      }
    ]
  },
  {
    id: 2,
    nest: [
      object: {
        date: '2020-04-22T00:00:00.000Z'
      },
      object: {
        date: '2020-04-23T00:00:00.000Z'
      },
      object: {
        date: '2020-04-24T00:00:00.000Z'
      },
      object: {
        date: '2020-04-25T00:00:00.000Z'
      }
    ]
  }
]

我想生成一个聚合,其形状与原始集合相同,但是根据特定文档限制objectsnest的数量。例如,对于集合的第一个成员,我希望date小于或等于"2020-04-20T00:00:00.000Z"的对象,对于第二个成员,我要date小于或等于的对象到"2020-04-24T00:00:00.000Z"。所以这就是我想要的输出:

[
  {
    id: 1,
    nest: [
      object: {
        date: '2020-04-19T00:00:00.000Z'
      },
      object: {
        date: '2020-04-20T00:00:00.000Z'
      }
    ]
  },
  {
    id: 2,
    nest: [
      object: {
        date: '2020-04-22T00:00:00.000Z'
      },
      object: {
        date: '2020-04-23T00:00:00.000Z'
      },
      object: {
        date: '2020-04-24T00:00:00.000Z'
      }
    ]
  }
]

我所获得的最远的结果将对集合的所有成员应用静态日期,如下所示:

{
  $project: {
    nest: {
      $filter: {
        input: "$nest",
        as: "nested",
        cond: { $lte: [ "$$nested.date", <date-goes-here> ] }
      }
    }
  }
}

这会将我使用的任何日期应用于集合的所有成员,而这并不是我想要的日期。

如何获得所需的输出?谢谢!

更新

这是针对返回1:1或群聊的聊天的端点。集合的每个成员都是聊天,而nest对象是特定聊天中的消息数组。我想对客户端请求群聊时返回的消息数进行分页,所以我的想法是仅提取客户端指定日期之前的消息。客户端可以发送一个请求,说对于聊天1(属于群聊),它希望在"2020-04-20T00:00:00.000Z"或之前发送消息,对于聊天2(也属于群聊),则它希望消息在或发送。在"2020-04-24T00:00:00.000Z"之前。我使用$match来获取客户端请求的聊天,并且我想使用$project来过滤客户端为该聊天指定的日期之后的消息。

1 个答案:

答案 0 :(得分:0)

是可以的,但是要做到这一点,您必须基于

这样的用户输入来创建一个JSON对象键值对
datesHash = { chatId:date,chatId2:date2} // these id's and dates will be based on user input as you mentioned above.

然后只需在上述聚合中巧妙地使用它,如

{
  $project: {
    nest: {
      $filter: {
        input: "$nest",
        as: "nested",
        cond: { $lte: [ "$$nested.date", datesHash["$_id"] ] }
      }
    }
  }
}

我已尝试在工作示例https://play.db-ai.co/m/Xr3LWwbYvgABFVSC上重新创建您的解决方案(仅供参考,并非确切的解决方案)