mongoDB 展开后对文档进行分组

mongoDB group documents after unwind

在我的 mongodb books collection 中,我有如下文档:

    {
      _id: ObjectId(625efa44f1ba751c8275ea51),
      contributors:[ObjectId(625efa44f1ba751c8275ea52), ObjectId(625efa44f1ba751c8275ea53)]
      //other fields
    }

我想做一个查询,returns 我记录如下:

    {
      _id: ObjectId(625efa44f1ba751c8275ea51),
      contributors:[
                     {
                       _id: ObjectId(625efa44f1ba751c8275ea52),
                       first_name: 'Luigi'
                       //many other fields
                     },
                     {
                       _id: ObjectId(625efa44f1ba751c8275ea53),
                       first_name: 'Mario'
                       //many other fields
                     },
                   ]
      //other fields
    }

我对贡献者进行了 unwind,对我的 users collection 进行了 lookup,现在我需要将它们分组。我以前没用过,但我做了类似的事情:

    {
        $group:{
                 _id: '_id'
               }
    }

但我不知道下一步该怎么做才能保留书籍和用户的所有字段。

你有什么想法吗?

如果 $lookup 结果足够小 (<16MB document size limit), 你可以简单地做一个 $lookup.

db.books.aggregate([
  {
    "$lookup": {
      "from": "users",
      "localField": "contributors",
      "foreignField": "_id",
      "as": "contributors"
    }
  }
])

这里是Mongo Playground供您参考。

如果 $lookup 结果将超过 16 MB 限制,您仍然可以 $unwind. Just use $firstto regroup the other fields after the$unwind`

db.books.aggregate([
  {
    "$lookup": {
      "from": "users",
      "localField": "contributors",
      "foreignField": "_id",
      "as": "contributors"
    }
  },
  {
    "$unwind": "$contributors"
  },
  {
    "$group": {
      "_id": "_id",
      bookName: {
        $first: "$bookName"
      },
      "contributors": {
        "$push": "$contributors"
      }
    }
  }
])

这里是Mongo playground供您参考。