我有两个收藏,编辑和书籍。每本书都与编辑器的parentId字段相关联,每本书都有一个分数(比如说1,2,3)和一个类型(科幻,浪漫等等)。
编辑:
{ _id: 1, name: "editor1" }
{ _id: 2, name: "editor2" }
...
和书籍
{ _id: 1, name: "book1", score: 1, parentId: 1, type: "sci-fi" }
{ _id: 2, name: "book2", score: 3, parentId: 1, type: "romance" }
{ _id: n, name: "bookn", score: 1, parentId: m, type: "detective" }
我想编写一个汇总,根据与之关联的所有图书的分数,以及可选择的图书类型,对编辑进行排序。
因此,我可以使用最受欢迎的书籍检索科幻小说的前10位编辑,或者只检索最受欢迎的书籍的前10位编辑,无论其类别如何。
捕获?使用mongo 3.2。我有强烈的印象,这是可能的3.4和3.6(我喜欢看怎么样),但目前,我发货的产品是mongo 3.2我可以&# 39;改变......
在编辑器集合上,我试图首先查找编辑器的所有书籍,然后展开,按parentId分组并创建一个新的字段分数,其中包含该组中所有书籍的分数总和,但后来我一直试图用这个分数将它与编辑器联系起来,最后对结果进行排序。
我在流星订阅中使用此聚合。
答案 0 :(得分:2)
您可以尝试以下聚合。
所以我可以找到最受欢迎的科幻小说的前10位编辑 书籍
db.editors.aggregate([
{"$lookup":{
"from":"books",
"localField":"_id",
"foreignField":"parentId",
"as":"books"
}},
{"$unwind":"$books"},
{"$match":{"books.type":"sci-fi"}},
{"$group":{
"_id":"$_id",
"name":{"$first":"$name"},
"scores":{"$sum":"$books.score"}
}},
{"$sort":{"scores":-1}},
{"$limit":10}
])
或者只是前10位编辑最热门的书籍,无论如何 类别。
db.editors.aggregate([
{"$lookup":{
"from":"books",
"localField":"_id",
"foreignField":"parentId",
"as":"books"
}},
{"$project":{
"name":1,
"scores":{"$sum":"$books.score"}
}},
{"$sort":{"scores":-1}}
])
答案 1 :(得分:1)
尝试以下聚合:
db.Editors.aggregate([
{
$lookup: {
from: "Books",
localField: "_id",
foreignField: "parentId",
as: "books"
}
},
{
$unwind: "$books"
},
{
$group: {
_id: "_id",
name: { $first: "$name" },
types: { $addToSet: "$books.type" },
totalScore: { $sum: "$books.score" }
}
},
{
$match: { "types": "sci-fi" }
},
{
$sort: { "totalScore": -1 }
}
])
$match
阶段的一个问题。您可以在$group
之前使用它来计算sci-fi
图书或$group
之后的分数,以计算所有图书的分数,但只获得那些至少拥有的作者一本sci-fi
本书(如我的回答)