云开发 所有记录中 tags列表里 元素tag 的统计方案?
各位大佬!
我有一个集合 book ,里面的记录格式有个列表是 tags ,里面写了各种 tag :
{
name: 'book1',
tags: [ 'tagA', 'tagB', 'tagC' ]
},
{
name: 'book2',
tags: [ 'tagB', 'tagC' ]
},
{
name: 'book3',
tags: [ 'tagA', 'tagB', 'tagD' ]
},
{
name: 'book4',
tags: [ 'tagA', 'tagC', 'tagD' ]
}
我想要的结果是所有tags里tag的集合列表:
tagList: [ 'tagA', 'tagA', 'tagA', 'tagB', 'tagB', 'tagB', 'tagC', 'tagC', 'tagC', 'tagD', 'tagD']
或者更进一步:各个 tag 的 name 和 num
tagList: [{ name: 'tagA', num: 3 }, { name: 'tagB', num: 3 }, { name: 'tagC', num: 3 }, { name: 'tagD', num: 2 } ]
现在我的方案很笨拙:
- 查询所有book的记录,放在 bookList 里
- 提取 bookList 里的所有 tags 的元素放进 tagList 里
- 最后统计出 tagLlist 各个 元素 的 name 和 num……
法子比较笨但可行,后面两步放在了本地计算,但我总觉得有更好的方法能在查询聚合那里能节省后面好几个步骤,官方文档看了好几遍了,社区和百度也查了很久了,没找到帮助,所以来提问了。
1 回复
最后还是我自己解答了,给地球节省资源了哈哈哈哈哈哈哈……
exports.main = async (event, context) => {
const db = cloud.database()
const $ = db.command.aggregate
const result = await db.collection('book')
.aggregate()
.project({
tags: 1,
})
.unwind('$tags')
.group({
_id: '$tags',
num: $.sum(1)
})
.limit(100)
.end()
return result
}