MongoDB Aggregation—返回不使用';不匹配查询

MongoDB Aggregation—返回不使用';不匹配查询,mongodb,nosql-aggregation,Mongodb,Nosql Aggregation,我很难找到正确的聚合管道操作来返回所需的结果 我有一个类似以下的收藏:- { "_id" : "writer1", "Name" : "writer1", "Website" : "website1", "Reviews" : [ { "Film" : { "Name" : "Jurassic Park",

我很难找到正确的聚合管道操作来返回所需的结果

我有一个类似以下的收藏:-

{
    "_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 } ] }
谁能给我指出正确的方向吗


干杯

你在这里问的是“有点可能”,但严肃地说,“有点疯狂”。我们怎么知道你们的作家是谁?请认真考虑一下。例如,如果在任何数据中都没有“writer3”,但您认为“writer3”存在的某个地方,那么我们从何处获得它?无论如何,您最好在“后处理”中处理“不存在”的数据,而不是将其扔到聚合框架中。就像SQL查询一样。有许多事情您“可以”是的,但真正的问题是“我真的应该这样做吗?”。我的回答是不,你不应该。不是作者不存在,而是存在,但我的聚合没有返回它,因为作者没有对$match中指定的电影进行审查,这导致平均分数计算不正确。请理解这里的概念。应在“后处理”中添加“不存在”的数据。在服务器端创建“零分结果”的“可能的作者”列表将大大降低速度。因此,即使有一个“编剧”集合可供来源,并且有10名编剧,只有1到2名编剧评论了一部电影,将所有10名编剧都扔到服务器上为其生成结果也是没有效率的。这应该很容易理解。当它们不是返回结果的一部分时,以0分将它们添加到结果中。效率更高,也更简单。啊,我知道你从哪里来了,对不起,你太笨了!我会重新考虑的,谢谢。