【发布时间】:2020-08-31 10:59:05
【问题描述】:
考虑这个集合:
[
{
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'
}
]
}
]
我想生成一个与原始集合具有相同形状的聚合,但根据特定文档限制nest 中objects 的数量。例如,对于集合的第一个成员,我想要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(也是一个群聊),它希望在 @ 或之前发送消息987654334@。我使用$match 获取客户端请求的聊天,我想使用$project 过滤掉客户端为该聊天指定的日期之后的消息。
【问题讨论】:
-
如果你有更多的文件在收集呢?应该从 3 个及以上应用什么条件?
-
这取决于集合的每个成员。我试图简化场景,但基本上对于具有某些属性的文档我应用此过滤器,而对于其他我不应用。我使用
$cond做到了这一点。但问题是,对于每个需要过滤器的文档,它都需要自己的唯一日期。 -
该条件的日期是否存在于文档中,或者它是否可以从文档中的某些内容推导出来?您可能希望包含如何计算日期的逻辑。
-
@TheeSritabtim 我添加了更多细节,如果您需要更多信息,请告诉我。谢谢!
-
在
$filter的cond中,可以指定条件为:(id = 1 AND nested.date lte "2020-04-20") OR (id = 2 AND nested.date lte "2020-04-24")。
标签: mongodb mongoose aggregation-framework