为什么用 $out 聚合两个 collections 永远不会结束? MongoDB

Why aggregate two collections with $out never ends ? MongoDB

好的,所以,我有两个 collection。其中一个有6M文件,另一个有25M文件。我想要他们在一个新的 collection:

Collection 1 个示例:

电影

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

Collection 2 例子:

字符

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

所以我想要一个新的 collection 比如:

{
  "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 做错了什么?

感谢任何建议。

您离开这里的主要内容是索引。

$lookup匹配外域时,MongoDB使用索引

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

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

然后应用查找聚合

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

希望这会有所帮助:)

问题不仅存在于单个 index 中,还存在于性能中。我强烈建议您使用 Cursors for heavy queries like yours. ()

当您使用此查询时,您还 "flooding" 您的 RAM 中包含所有文档。所以使用游标肯定会对你有帮助。

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