【问题标题】:Why aggregate two collections with $out never ends ? MongoDB为什么用 $out 聚合两个集合永远不会结束? MongoDB
【发布时间】:2020-05-01 05:38:10
【问题描述】:

好的,所以,我有两个系列。其中一个有 6M 文档,另一个有 25M 文档。我希望它们在一个新系列中:

集合 1 示例:

电影

 {"movieId" : "1", "name" : "Titanic"},
 {"movieId" : "2", "name" : "King Kong"}

集合 2 示例:

人物

{"characterId": "1", "movieId": "1", "characterName": "Name 1"},
{"characterId": "2", "movieId": "1", "characterName": "Name 2"},
{"characterId": "3", "movieId": "1", "characterName": "Name 3"}

所以我想要一个新的集合,例如:

{
  "movieId" : "1", 
  "name" : "Titanic", 
  "characters":[ *collection 2 here* ]
},
{
  "movieId" : "2", 
  "name" : "King Kong", 
  "characters":[]
}

我试过了:

db.Movie.aggregate([{ $lookup: { from: "Character",localField: "movieId", foreignField: "movieId", as: "characters" }},{ $out : "movie_characters" }])

但它永远不会结束 :((我的意思是 10 小时后它仍在思考)如果我在没有 $out 的情况下执行它,它可能会在 10 分钟内显示结果。

我在 $out 上做错了吗?

感谢您的建议。

【问题讨论】:

  • 哪个集合有 25M 文档?

标签: mongodb aggregate mongodb4.0


【解决方案1】:

您在这里留下的主要内容是索引。

$lookup匹配外部字段时,MongoDB使用索引。

因此,使用以下方法在字符集合中创建索引:

db.Character.createIndex({ "movieId": 1 })

然后应用查找聚合

db.Movie.aggregate([
  {
    $lookup: {
      from: "Character",
      localField: "movieId", 
      foreignField: "movieId", 
      as: "characters" 
    }
  },
  { 
    $out : "movie_characters" 
  }
])

希望这会有所帮助:)

【讨论】:

  • 我很高兴它有帮助:)
【解决方案2】:

问题不仅在于单个index,还在于性能。我强烈建议您使用Cursors 处理像您这样的繁重查询。 (Check this answer for more info)

当您使用此查询时,您还会用所有文档“淹没”您的 RAM。所以使用游标肯定会对你有所帮助。

此外,在通过Explain 模式在生产环境中启动查询之前,请尝试使用Mongo Compass 测试您的查询,这将为您提供您需要知道的所有信息,尤其是您的查询需要多长时间执行,它使用什么索引,以及更多。

【讨论】:

  • 谢谢,Vijay Rajpurohit 解决了它,但我正在阅读您发送的用于期货参考的文档。祝你有美好的一天:) 感谢您的宝贵时间
猜你喜欢
  • 2011-08-04
  • 1970-01-01
  • 2016-03-30
  • 2017-01-02
  • 2013-09-11
  • 2020-09-11
  • 2015-08-28
  • 2017-07-13
  • 1970-01-01
相关资源
最近更新 更多