云开发 所有记录中 tags列表里 元素tag 的统计方案?
发布于 8 年前 作者 eshen 501 次浏览 来自 问答

各位大佬!

我有一个集合 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 } ]

现在我的方案很笨拙:

  1. 查询所有book的记录,放在 bookList 里
  2. 提取 bookList 里的所有 tags 的元素放进 tagList 里
  3. 最后统计出 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
}
回到顶部