我有一个使用MongoDB Aggregation框架从数据库查询生成的对象数组。
[
{ user_type: 'STUDENT', comments : 25 },
{ user_type: 'PARENT', comments: 35 },
{ user_type: 'TEACHER', comments: 26 },
{ user_type: 'PARENT', comments: 41 },
{ user_type: 'PRINCIPAL', comments: 60 },
]
mongodb
的查询管道是这样的,只有当该用户类型的任何人对特定帖子发表评论时,如果来自{user_type
没有评论,它将在数组中返回user_type
{1}}该用户类型不会在数组中显示。
要完成一项任务,我需要检查是否所有人都已注释,如果是,则显示其计数,所以我需要检查数组是否至少有一个对象,每个user_type对照本地保存的列表,即PARENT, TEACHER, STUDENT, PRINCIAPL
此列表可以随意改变。
编辑:我的要求是对象数组必须至少有一个对象,该对象具有每个本地保存列表的用户类型。
澄清:这里的评论数量是该类型的所有用户的评论,即如果两位教师评论了10条评论,那么user_type老师有20条评论
答案 0 :(得分:1)
使用Array.prototype.reduce()
,您可以在给定数组types
的情况下为每个聚合注释计数创建一个属性。
function aggregateComments(results = [], types = []) {
return types.reduce((acc, type) => {
acc[type] = results.filter(
({ user_type }) => user_type === type
).reduce((sum, { comments }) => sum + comments, 0);
return acc;
}, {});
}
const results = [
{ user_type: 'STUDENT', comments : 25 },
{ user_type: 'PARENT', comments: 35 },
{ user_type: 'TEACHER', comments: 26 },
{ user_type: 'PARENT', comments: 41 },
{ user_type: 'PRINCIPAL', comments: 60 },
];
const types = ['STUDENT', 'PARENT', 'TEACHER', 'PRINCIPAL'];
console.log(aggregateComments(results, types));
答案 1 :(得分:1)
您可以从MongoDB的结果中获取user_types
(函数map
),然后检查该本地列表(过滤器)中的user_types
是否都包含在内(函数{{1 }})。
every
未包含在内,因此应返回DUMMY
。
false

var filter = ["STUDENT", "DUMMY"];
var array = [ { user_type: 'STUDENT', comments : 25 }, { user_type: 'PARENT', comments: 35 }, { user_type: 'TEACHER', comments: 26 }, { user_type: 'PARENT', comments: 41 }, { user_type: 'PRINCIPAL', comments: 60 },];
var mapped = array.map(o => o.user_type),
result = filter.every((f) => mapped.includes(f));
console.log(result);

包含所有.as-console-wrapper { max-height: 100% !important; top: 0; }
,因此应返回user_types
。
true

var filter = ["STUDENT", "PRINCIPAL", "TEACHER"];
var array = [ { user_type: 'STUDENT', comments : 25 }, { user_type: 'PARENT', comments: 35 }, { user_type: 'TEACHER', comments: 26 }, { user_type: 'PARENT', comments: 41 }, { user_type: 'PRINCIPAL', comments: 60 },];
var mapped = array.map(o => o.user_type),
result = filter.every((f) => mapped.includes(f));
console.log(result);