首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按行为体划分的mognodb聚集组

按行为体划分的mognodb聚集组
EN

Stack Overflow用户
提问于 2019-12-26 18:16:06
回答 2查看 118关注 0票数 1

我有以下电影收藏结构:

代码语言:javascript
复制
{
   "_id" : ObjectId,
   "title" : "movie-1",
   "actors" : [
      "actor-1",
      "actor-2",
      "actor-3",
   ],
   "categories" : [
     "category-1",
     "category-2"
   ]
 }

我想显示所有演员与相关电影和类别的结果,如下所示:

代码语言:javascript
复制
{
    "actor": "actor-1",
    "result": {
        "category-1": [ "movie-1", "movie-2" ],
        "category-2": [ "movie-1", "movie-4" ]
    }
}

我尝试了如下所示的聚合:

代码语言:javascript
复制
db.film.aggregate([
   {  $unwind: "$actors"  },
   {  $group: { 
        _id: "$actors", 
        data: {  $push: {  movie: "$title",   categories: "$categories"  } }
      }
   }, 
   {
      $project: {
        _id: 0,
        actor: "$_id",
        result: {
          $reduce: {
             input: "$data",
             initialValue: {},
             in: {
               $let: {
                  vars: { movie: "$$this.movie", categories: "$$this.categories" },
                  in: {
                     $arrayToObject: {
                         $map: {
                           input: "$$categories",
                           in: { k: "$$this",  v: "$$movie" }
                         }
                      }
                  }
               }
             }
           }
        }
      }
    }
 ])

但我得到的所有演员名单上只有一个类别的电影,如下所示:

代码语言:javascript
复制
{
   "actor" : "actor-1",
   "result" : {
     "category-1" : "movie-1",
     "category-2" : "movie-2",
     "category-3" : "movie-3"
   }
}

我该如何解决这个问题?提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-26 20:03:28

用大锤敲螺母 (c)

有些阶段可以由$reduce代替,在$project阶段内完成(欢迎批评和建议)

代码语言:javascript
复制
db.film.aggregate([
  {
    $unwind: "$actors"
  },
  {
    $group: {
      _id: "$actors",
      data: {
        $push: {
          movie: "$title",
          categories: "$categories"
        }
      }
    }
  },
  {
    $unwind: "$data"
  },
  {
    $unwind: "$data.categories"
  },
  {
    $group: {
      _id: {
        actors: "$_id",
        categories: "$data.categories"
      },
      movies: {
        $push: "$data.movie"
      }
    }
  },
  {
    $project: {
      _id: 0,
      actor: "$_id.actors",
      result: {
        k: "$_id.categories",
        v: "$movies"
      }
    }
  },
  {
    $group: {
      _id: "$actor",
      result: {
        $push: "$result"
      }
    }
  },
  {
    $project: {
      _id: 0,
      actor: "$_id",
      result: {
        $arrayToObject: "$result"
      }
    }
  },
  {
    $sort: {
      actor: 1
    }
  }
])

MongoPlayground

票数 1
EN

Stack Overflow用户

发布于 2019-12-26 20:37:08

您可能需要在categories数组上执行另一个actors数组,然后按两个字段(即参与者字段和类别字段)对所有扁平的文档进行分组,以创建电影标题列表。

需要另一个组来形成结果字段。

下面的管道应该给出所需的结果:

代码语言:javascript
复制
db.film.aggregate([
    { "$unwind": "$actors" },
    { "$unwind": "$categories" },
    { "$group": { 
        "_id": { "actor": "$actors", "category": "$categories" },
        "movies": { "$push": "$title" }
    } },
    { "$group": { 
        "_id": "$_id.actor",
        "result": { 
            "$push": {
                "k": "$_id.category",
                "v": "$movies"
            }   
        }
    } },
    { "$addFields": {
       "result": { "$arrayToObject": "$result" }  
    } }
])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59491984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档