考虑此收藏集:
[
{
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'
}
]
}
]
我想生成一个聚合,其形状与原始集合相同,但是根据特定文档限制objects
中nest
的数量。例如,对于集合的第一个成员,我希望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
来过滤客户端为该聊天指定的日期之后的消息。
答案 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上重新创建您的解决方案(仅供参考,并非确切的解决方案)