MongoDb-使用查找聚合时如何仅返回嵌套子文档的字段?

MongoDb-使用查找聚合时如何仅返回嵌套子文档的字段?,mongodb,nosql,bigdata,aggregation-framework,nosql-aggregation,Mongodb,Nosql,Bigdata,Aggregation Framework,Nosql Aggregation,我对MongoDb非常陌生,所以我习惯了SQL。 现在我的数据库中有两个集合: 1具有嵌套子文档的系列 2评论决定参考插曲子文档,因为会有很多评论 为了更好地理解,请参见此图片 现在我想实现以下目标。在这种情况下,每复习两遍,我就想得到一集的名称 我尝试了以下方法: db.review.aggregate([ { $lookup:{ from:"series", localField:"episode", for

我对MongoDb非常陌生,所以我习惯了SQL。 现在我的数据库中有两个集合:

1具有嵌套子文档的系列

2评论决定参考插曲子文档,因为会有很多评论

为了更好地理解,请参见此图片

现在我想实现以下目标。在这种情况下,每复习两遍,我就想得到一集的名称

我尝试了以下方法:

db.review.aggregate([  
   {  
      $lookup:{  
         from:"series",
         localField:"episode",
         foreignField:"seasons.episodes._id",
         as:"episode_entry"
      }
   }
]).pretty()
问题是,这当然不仅返回了引用的剧集的标题,而且还返回了整个赛季的文档

请参见下图了解我的当前输出

我不知道如何实现它。请帮帮我。
我正在使用Mongo 3.4.9,我建议使用以下系列结构,将季节数组展开为多个文档,每个季节一个文档

这将帮助您直接插入/更新剧集

差不多

db.series.insertMany([
  {
    "title": "Sherlock Holmes",
    "nr": 1,
    "episodes": [
      {
        "title": "A Study in Pink",
        "nr": 1
      },
      {
        "title": "The Blind Banker",
        "nr": 2
      }
    ]
  },
  {
    "title": "Sherlock Holmes",
    "nr": 2,
    "episodes": [
      {
        "title": "A Scandal in Belgravia",
        "nr": 1
      },
      {
        "title": "The Hounds of Baskerville",
        "nr": 2
      }
    ]
  }
])
查找查询将执行以下操作

episode: { $in: [ episodes._id1, episodes._id2, ... ] }
从文件中

如果该字段包含数组,则$in运算符将选择 其字段包含至少包含一个数组的文档 与指定数组中的值匹配的元素,例如,等

因此,当存在匹配时,查找将返回所有剧集。然后,您可以进行筛选,只保留与您的评论片段相匹配的片段

因此,查询将如下所示

db.review.aggregate([
  {
    "$lookup": {
      "from": "series",
      "localField": "episode",
      "foreignField": "episodes._id",
      "as": "episode_entry"
    }
  },
  {
    "$addFields": {
      "episode_entry": [
        {
          "$arrayElemAt": {
            "$filter": {
              "input": {
                "$let": {
                  "vars": {
                    "season": {
                      "$arrayElemAt": [
                        "$episode_entry",
                        0
                      ]
                    }
                  },
                  "in": "$$season.episodes"
                }
              },
              "as": "result",
              "cond": {
                "$eq": [
                  "$$result._id",
                  "$episode"
                ]
              }
            }
          }
        },
        0
      ]
    }
  }
])

请您将样本数据以文本格式发布,而不是使用图像,以便我们可以复制和粘贴它?另外,你想要的确切输出结构是什么?非常感谢你的回答。我还看到人们在这个用例中只使用一个集合。你觉得我把评论和其他评论分开的想法怎么样?这是一个很好的做法,因为它的容量很大,还是您更喜欢将它作为子文档放在一个eption entry.Np中。单个文档的存储空间有16MB的限制。如果你认为你会在剧集中嵌入评论达到极限,那么我会将评论保留在自己的收藏中。您还可以对文档进行建模,以便在单个文档中存储季节、插曲及其评论。尽量不要在数组中嵌入数组,因为更新/插入值会变得很困难。有很多方法可以为文档建模,但请根据您的用例选择一种适合的方法。您的$$结果。\u id是错误的,因为我需要这一集的id。目前,这是本季最热门的节目。我怎样才能得到更深一层的id?对不起,我应该注意到这一点。更新的答案包括$let表达式,将一季的剧集投影到$filter聚合。哇,thnx!我认为MongoDb比sql复杂得多。