首页 文章

只获取每个用户的一个文档 - mongoDB

提问于
浏览
1

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

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

POSTS collection data

{
  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'
}

Here is my query

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) });

Desired Output

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

3 回答

  • 1

    $group :将作为mysql的分组 . $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"
            }
        ]
    }
    
  • 1

    此外,您可以使用 group$last

    db.getCollection('posts').aggregate([
      { "$match": { "language": 'english', "status": "A" }},
      { "$group": {
        "_id": "$userId",
         "primaryId" : { "$last": "$_id" },
        "language": { "$last": "$language" },
        "status": { "$last": "$status" },
        "desc": { "$last": "$desc" }
      }},
      { "$lookup": {
        "from": "users",
        "localField": "_id",
        "foreignField": "_id",
        "as": "ownerData"
      }},
      { $unwind:{path: '$ownerData',preserveNullAndEmptyArrays: true} //to convert ownerData to json object
    }
    ])
    
  • 3

    您可以将$group聚合阶段用于distinct userId ,然后使用$lookup获取用户数据 .

    db.col('posts').aggregate([
      { "$match": { "language": 'english', "status": "A" }},
      { "$sample": { "size": 10 }},
      { "$sort": { "_id": -1 }},
      { "$group": {
        "_id": "$userId",
        "language": { "$first": "$language" },
        "status": { "$first": "$status" },
        "desc": { "$first": "$desc" }
      }},
      { "$lookup": {
        "from": "users",
        "localField": "_id",
        "foreignField": "_id",
        "as": "ownerData"
      }}
    ])
    

相关问题