mongodb - 获取过滤字段大小的总数
问题描述
user_number: {
$add: [
$size: {
'$schedules.users': {
$filter: {
input: '$schedules',
as: 'schedule',
cond: {
$and: [
{
$gte: ['$$schedule.schedule_info.schedule_time', start_date]
},
{ $lte: ['$$schedule.schedule_info.schedule_time', end_date] }
]
}
}
}
},
]
}
我想返回参加过滤事件的时间表的用户总数。每个文档的schedules.users
字段都是一个包含user names
. 如何获取属于过滤计划的用户总数?
我可以通过 using$add
和参加日程的用户总数来获得总数$size
。但是,我坚持将它们与$filter
.
编辑:
{
schedules: [
{
name: 'gaming events',
date: '2021-01-14 07:00:00.000Z'
attendee: [
'john',
'jane',
'joe',
'dow',
],
},
{
name: 'GTA events',
date: '2021-01-15 07:00:00.000Z'
attendee: [
'john',
'Tina',
'joe',
],
},
{
name: 'gaming events',
date: '2021-01-19 07:00:00.000Z'
attendee: [
'john',
'jane',
'joe',
'dow',
],
},
],
calcDistance: 1643.3598155320283,
},
- 给定日期的过滤计划。
- 从过滤的日程中返回参加者的总数。
如果我用“2021-01-14 到 2021-01-15”过滤时间表,那么它将是 4 + 3 = 7。
解决方案
$filter
根据您在第一阶段的日期条件安排$reduce
迭代循环并获取使用和schedules.attendee
的总计数和大小attendee
$add
$size
db.collection.aggregate([
{
$addFields: {
schedules: {
$filter: {
input: "$schedules",
cond: {
$and: [
{ $gte: ["$$this.date", start_date] },
{ $lte: ["$$this.date", end_date] }
]
}
}
}
}
},
{
$addFields: {
totalAttendees: {
$reduce: {
input: "$schedules.attendee",
initialValue: 0,
in: { $add: [{ $size: "$$this" }, "$$value"] }
}
}
}
}
])
推荐阅读
- javascript - 模块中找不到函数
- variables - 是否有一种更简洁的方法可以稍后在代码中设置顶级变量而不使其成为 lateinit var?
- laravel - 如何在 Laravel 中使用 Eloquent 的输入和集合重定向回先前的模板?
- java - 从 CSV 读取 ISO-8859-1 编码数据
- android - 如何将谷歌地图中的相机和标记移动到intent.putExtra Android接收的纬度和经度数据
- docker - 如何使用 Visual Studio Code *CLI* 将远程容器附加到正在运行的容器
- python - Websocket Secure 使用 Javascript 客户端和 Python 服务器
- python - 返回 None 而不是 String
- fortran - JNA Fortran 性能调优
- c# - 使用热键/键盘快捷键打开和关闭第二个表单