为什么用 $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 测试您的查询,这会为您提供所有您需要知道的信息,尤其是您的查询需要多长时间才能执行,它使用什么索引,等等。
好的,所以,我有两个 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 测试您的查询,这会为您提供所有您需要知道的信息,尤其是您的查询需要多长时间才能执行,它使用什么索引,等等。