根据子文档的分数对mongo集合进行排序

时间:2018-03-18 12:17:46

标签: mongodb meteor aggregation-framework

我有两个收藏,编辑和书籍。每本书都与编辑器的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分组并创建一个新的字段分数,其中包含该组中所有书籍的分数总和,但后来我一直试图用这个分数将它与编辑器联系起来,最后对结果进行排序。

我在流星订阅中使用此聚合。

2 个答案:

答案 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本书(如我的回答)