2

好的,所以,我有两个系列。其中一个有 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 上做错了吗?

感谢您的任何建议。

4

2 回答 2

2

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

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

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

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

然后应用查找聚合

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

希望这会有所帮助:)

于 2020-05-01T07:11:11.457 回答
1

问题不仅在单曲上index,而且在性能上。我强烈建议您将光标用于像您这样的繁重查询。(查看此答案以获取更多信息

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

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

于 2020-05-01T08:57:36.930 回答