mongodb aggregate查询结果如果做populate

刚刚接触nodejs及mongodb,所以有些东西不太熟悉,遇到一个问题,希望各位大神能帮忙看看。

两个数据模型如下:
Category:

{
    "_id" : ObjectId("5d706f2ccc792d3ba88f1b53"),
    "title" : "前端",
    "__v" : 0
}

Article:

{
    "_id" : ObjectId("5d706fa8dbc39a34249a2795"),
    "categories" : [ 
        ObjectId("5d706f30cc792d3ba88f1b54")
    ],
    "title" : "标题2",
    "body" : "内容2",
    "createdAt" : ISODate("2019-09-05T02:15:04.127Z"),
    "updatedAt" : ISODate("2019-09-05T02:15:04.127Z"),
    "__v" : 0
}

期望:按年进行分类并统计每个年份的数据个数及详细的数据项
利用聚合查询:

const data = await Article.aggregate([{
    $group: {
      _id: {
        $year: '$createdAt',
      },
      count: {$sum: 1},
      list: {
        $push: {
          title: '$title',
          summary: '$summary',
          categories: '$categories',
          createdAt: '$createdAt',
        }
      }
    }
  }
])

得到如下结果:
clipboard.png

但是这个categories字段我想要的不只是id,而是要返回id对应的category详情,请各位大神帮帮看看改怎么写?

阅读 3.5k
2 个回答

问题解决了:

const data = await Article.aggregate([
    {
        $lookup:{
            from: 'categories',
            localField: 'categories',
            foreignField: '_id',
            as: 'newList'
        }
    },
    {
        $group: {
            _id: {
                $year: '$createdAt',
            },
            count: {$sum: 1},
            list: {
                $push: {
                    title: '$title',
                    summary: '$summary',
                    categories: '$newList',
                    createdAt: '$createdAt',
                }
            }
        }
    }
])
const data = await Article.aggregate([{
    $group: {
      _id: {
        $year: '$createdAt',
      },
      count: {$sum: 1},
      list: {
        $push: {
          title: '$title',
          summary: '$summary',
          categories: '$categories',
          createdAt: '$createdAt',
        }
      }
    }
  },
  {
   $lookup:{ 
      from: 'Category', localField: '_id', foreignField: 'categories', as: 'categories' }
}
])

$loogup就是相当于从当前表的某个字段关联到另一个表中的字段,最后一个as相当于别名把。你可以试一试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题