2

我无法找出正确的聚合管道操作来返回我需要的结果。

我有一个类似于以下的集合:-

{
    "_id" : "writer1",
    "Name" : "writer1",
    "Website" : "website1",
    "Reviews" : [
            {
                    "Film" : {
                            "Name" : "Jurassic Park",
                            "Genre" : "Action"
                    },
                    "Score" : 4
            },
            {
                    "Technology" : {
                            "Name" : "Mad Max",
                             "Genre" : "Action"
                    },
                    "Score" : 5
            }
    ]
}
{
    "_id" : "writer2",
    "Name" : "writer2",
    "Website" : "website1",
    "Reviews" : [           
            {
                    "Technology" : {
                            "Name" : "Mad Max",
                             "Genre" : "Action"
                    },
                    "Score" : 5
            }
    ]
}

这是我到目前为止的聚合:-

db.writers.aggregate([
    { "$unwind" : "$Reviews" },
    { "$match" : { "Reviews.Film.Name" : "Jurassic Park" } },
    { "$group" : { "_id" : "$Website" , "score" : { "$avg" : "$Reviews.Score" },
        writers :{ $push: { name:"$Name", score:"$Reviews.Score" } }
    }}
])

这仅返回对匹配电影进行评论的作家,也仅返回至少有 1 位作家评论该电影的网站,但是,我需要返回包含所有作者列表的所有网站,如果得分为 0他们还没有为指定的电影写评论。

所以,我目前得到: -

{ "_id" : "website1", "score" : 4, "writers" : [ { "name" : "writer1", "score" : 4 } ] }

当我真正需要时:-

{ "_id" : "website1", "score" : 2, "writers" : [ { "name" : "writer1", "score" : 4 },{ "name" :"writer2", "score" : 0 } ] }

谁能指出我正确的方向?

干杯

4

0 回答 0