收藏
回答

云开发 所有记录中 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 } ]

现在我的方案很笨拙:

  1. 查询所有book的记录,放在 bookList 里
  2. 提取 bookList 里的所有 tags 的元素放进 tagList 里
  3. 最后统计出 tagLlist 各个 元素 的 name 和 num……

法子比较笨但可行,后面两步放在了本地计算,但我总觉得有更好的方法能在查询聚合那里能节省后面好几个步骤,官方文档看了好几遍了,社区和百度也查了很久了,没找到帮助,所以来提问了。

最后一次编辑于  2020-02-29
回答关注问题邀请回答
收藏

1 个回答

  • 泽文
    泽文
    2020-02-29

    最后还是我自己解决了……文档看的还不够仔细

    其实用unwind展开列表后再统计就可以了

    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
    }
    
    2020-02-29
    有用 2
    回复
登录 后发表内容
问题标签