请教一个关于mongodb(mongoose)的问题,一个博客,有两张表,文章和tag,多对多关系,文章表内有tag字段是一个数组,存储着tag的id,查询文章的时候可以关联出每一个tag的数据,现在的需求是:查询tag list的时候,需要同时得到每个tag分别被多少个文章包含着,即count,除了 遍历 和 手动建立count字段增删改时重新统计是否还有更好的通过mongoose api实现的方法,感谢各位大神!
解决了,需要聚合查询,聚合前先分解,然后聚合,具体代码,其实本身聚合查询可以查询需求,但是需求是多对多数据关系,而非一对多,所以必须先分解为一对一关系
相关代码片段相关参考文档
// 查询article-tag的count聚合数据 const getTagsCount = tags => { let $match = {}; if (!authIsVerified(req)) { $match = { state: 1, public: 1 }; } Article.aggregate([ { $match }, { $unwind : "$tag" }, { $group: { _id: "$tag", num_tutorial: { $sum : 1 }} } ]) .then(counts => { const newTags = tags.docs.map(t => { const finded = counts.find(c => String(c._id) === String(t._id)); t.count = finded ? finded.num_tutorial : 0; return t; }); tags.docs = newTags; querySuccess(tags); }) .catch(err => { querySuccess(tags); }) };
mongoose 里面有一个叫 Population 这个非常好用建议去了解一下
解决了,需要聚合查询,聚合前先分解,然后聚合,具体代码,其实本身聚合查询可以查询需求,但是需求是多对多数据关系,而非一对多,所以必须先分解为一对一关系
相关代码片段
相关参考文档
mongoose 里面有一个叫 Population 这个非常好用建议去了解一下