繁体   English   中英

MongoDB:嵌套聚合

[英]MongoDB: Nested aggregation

我有多个 collections:

用户 - 集合架构

历史是用户集合/文档的子文档

name: "jacob"
_id: 5fc53209e70f776378cce0c5,
history: [
  {
     _id: 5fc634bee65f96338a63b9e4,
     article: 5fc5f3e6140646c2024f7963,
     created_at: 2010-12-01T12:19:10.121+00:00
  },
  {
    _id: 5fc634d8e65f96338a63b9e5,
    article: 5fc5faaa8b1fffc1f4dec900,
    created_at: 2010-12-01T12:19:36.102+00:00
  }
]

文章 - 集合架构

{
   _id: 5fc5faaa8b1fffc1f4dec900,
   title: "hello there",
   author: 5fc531cae70f776378cce0c4 // Author is related to user collection
},
{
   _id: 5fc5f3e6140646c2024f7963,
   title: "hello wonderland",
   author: 5fc531cae70f776378cce0c4 // Author is related to user collection
}

是否可以先$lookup历史中的文章,然后$lookup文章的作者? 并且还按历史日期排序?

所需 Output

...
name: "jacob",
_id: 5fc53209e70f776378cce0c5,
history: [
  {
     _id: 5fc634bee65f96338a63b9e4,
     article: {
        _id: 5fc5faaa8b1fffc1f4dec900,
        title: "hello there",
        author: {
           _id: 5fc531cae70f776378cce0c4,
           name: "melissa"
        }
     },
     created_at: 2010-12-01T12:19:10.121+00:00
  },
  {
    _id: 5fc634d8e65f96338a63b9e5,
    article: {
       _id: 5fc5faaa8b1fffc1f4dec900,
       title: "hello wonderland",
       author: {
          _id: 5fc531cae70f776378ccedsu8,
         name: "omelia",
       }
    },
    created_at: 2010-11-12T2:19:36.102+00:00
  }
]

注意:按日期降序排列

你可以试试,

  • $unwind解构history数组
  • $lookup加入文章集合,让传递文章 id,
    • $match匹配文章 id
    • $lookup加入用户集合
    • $unwind解构 users 因为它的数组
    • $project显示必填字段
  • $unwind解构文章数组
  • $sortcreated_at日期排序
  • $group by id 并重建history数组
db.users.aggregate([
  { $unwind: "$history" },
  {
    $lookup: {
      from: "articles",
      let: { articleId: "$history.article" },
      pipeline: [
        { $match: { $expr: { $eq: ["$_id", "$$articleId"] } } },
        {
          $lookup: {
            from: "users",
            localField: "author",
            foreignField: "_id",
            as: "author"
          }
        },
        { $unwind: "$author" },
        {
          $project: {
            _id: 1,
            author: { _id: 1, name: 1 },
            title: 1
          }
        }
      ],
      as: "history.article"
    }
  },
  { $unwind: "$history.article" },
  { $sort: { "history.created_at": -1 } },
  {
    $group: {
      _id: "$_id",
      history: { $push: "$history" },
      name: { $first: "$name" }
    }
  }
])

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM