【问题标题】:how to change code to finish aggregation in mongodb?如何更改代码以在 mongodb 中完成聚合?
【发布时间】:2016-04-16 22:22:36
【问题描述】:

我在 json 中有一个书单如下:

{
    "_id" : ObjectId("1"),
    "author" : [
        "Mary",
        "Tony"
    ],
    "booktitle" : "Book1",
    "Category" : "Children"
}
{
        "_id" : ObjectId("2"),
        "author" : [
            "Joe",
            "Tony"
        ],
        "booktitle" : "Book2",
        "Category" : "Children"
}
{
            "_id" : ObjectId("3"),
            "author" : [
                "Joe",
            ],
            "booktitle" : "Book3",
            "Category" : "comedy"
}
.......

我希望获得在两个不同类别中出版书籍的作者数量。

以上面的例子: 玛丽有《孩子》的书,托尼有《孩子》的书,乔有《孩子》和《喜剧》的书。因此,我希望获得第一名,因为乔是唯一一个出版不同类别书籍的人。

我在 mongoDB 中写了以下代码,但不知道如何填充匹配部分:

db.collection.aggregate([     
{ $match:{ }},     
{ $project:{ _id:0, author:1 }},     
{ $unwind:"$author" },     
{ $group:{ _id:null, count:{ $sum: 1} }}  
])

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您的聚合管道中有几个错误:

    • 您希望将所有个文档都考虑在内来计算类别,因此开头不应有 $match。
    • 您需要类别字段,因此您需要将其放入初始投影中
    • 您想按作者分组,因此作者需要是您 $group 的 _id 的一部分。
    • 当作者在一个类别中有三本书时,您想将其计为一个类别,而不是三个。这意味着您需要在 $group 中使用 $addToSet 来为每个作者生成一个唯一类别的数组。
    • 然后您计数后过滤结果。这意味着您需要在最后执行 $match 。您要匹配的是唯一类别数组的大小。
    • 然后你最后 $group by null 得到总数。

    这是你的聚合应该是这样的(未经测试):

         db.collection.aggregate([
             { $project:{ _id:0, author:1, Category:1 } },     
             { $unwind:"$author" },     
             { $group:{ _id:"$author", categories:{ $addToSet: "$Category"} } },
             { $match: { categories: { $size: 2 } },
             { $group:{ _id:null, count:{ $sum: 1} }}  
         ])
    

    【讨论】:

    • 我尝试使用这种方法,但是失败了。它给了我错误:“超出了 $group 的内存限制,但不允许外部排序。通过 allowDiskUse:true 来选择加入。”可能有更好的方法来编写代码...您还有其他想法吗?
    • @cacao $group-stage 有 100MB 的限制。我没想到你会有这么多数据。请参阅 stackoverflow.com/questions/26069601/… 了解“通过 allowDiskUse:true 选择加入”的含义。
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多