首页 > 解决方案 > 每个用户只获取一个文档 - mongoDB

问题描述

我坚持使用 mongo 聚合查询。现在我有一个集合,其中包含各种用户的帖子(其详细信息存在于用户集合中)。

我需要一个查询来获取每个用户的一个帖子(如 SQL 中的 group by)

POSTS 收集数据

{
  language:'english',
  status:'A',
  desc:'Hi there',
  userId:'5b891370f43fe3302bbd8918'
},{
  language:'english',
  status:'A',
  desc:'Hi there - 2'
  userId:'5b891370f43fe3302bbd8918'
},{
  language:'english',
  status:'A',
  desc:'Hi there - 3'
  userId:'5b891370f43fe3302bbd8001'
}

这是我的查询

db.col('posts').aggregate([
    {
        $match: {
            language: 'english',
            status: "A"
        }
    }, {
        $sample: { size: 10 }
    }, {
        $sort: { _id: -1 }
    }, {
        $lookup: {
            from: 'users',
            localField: 'userId',
            foreignField: '_id',
            as: 'ownerData'
        }
    }], (err, data) => { console.log(err,data) });

期望的输出

   {
      language:'english',
      status:'A',
      desc:'Hi there',
      userId:'5b891370f43fe3302bbd8918',
      ownerData:[[object]]
    },{
      language:'english',
      status:'A',
      desc:'Hi there - 3'
      userId:'5b891370f43fe3302bbd8001',
      ownerData:[[object]]
    }

标签: node.jsmongodbmongooseaggregation-framework

解决方案


$group:将作为 mysql 的 group by。$first:将从组中获取集合字段的第一个元素。$lookup充当 mysql 中的连接。

db.tempdate.aggregate([ 
    { $group : 
        { 
          _id : "$userId", 
          language : { $first: '$language' }, 
          status : { $first: '$status' },  
          desc : { $first: '$desc' } 
        } 
     },
     { $lookup: 
        { 
            from: "user", 
            localField: "_id", 
            foreignField: "user_id",
            as: "userData" 
         } 
     }
 ]).pretty();`

Output

`{
    "_id" : "5b891370f43fe3302bbd8001",
    "language" : "english",
    "status" : "A",
    "desc" : "Hi there - 3",
    "userData" : [
        {
            "_id" : ObjectId("5ba3633a12b8613823f3056e"),
            "user_id" : "5b891370f43fe3302bbd8001",
            "name" : "Bhuwan"
        }
    ]
}
{
    "_id" : "5b891370f43fe3302bbd8918",
    "language" : "english",
    "status" : "A",
    "desc" : "Hi there",
    "userData" : [
        {
            "_id" : ObjectId("5ba3634612b8613823f3056f"),
            "user_id" : "5b891370f43fe3302bbd8918",
            "name" : "Harry"
        }
    ]
}

推荐阅读