Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改代码以完成mongodb中的聚合?_Mongodb - Fatal编程技术网

如何更改代码以完成mongodb中的聚合?

如何更改代码以完成mongodb中的聚合?,mongodb,Mongodb,我有一个json图书列表,如下所示: { "_id" : ObjectId("1"), "author" : [ "Mary", "Tony" ], "booktitle" : "Book1", "Category" : "Children" } { "_id" : ObjectId("2"), "author" : [ "Joe", "Tony

我有一个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} }}  
])

聚合管道中有几个错误:

  • 您希望计算所有文档的类别,因此在开始时不应该有$match
  • 您需要category字段,因此需要将其放入初始投影中
  • 您希望按作者分组,因此作者需要是$group的
    \u id
    的一部分
  • 当作者在一个类别中有三本书时,您希望将其计算为一个类别,而不是三本。这意味着您需要在$group中使用$addToSet来生成每个作者的唯一类别数组
  • 然后在计算结果后对其进行过滤。这意味着您需要在最后执行$match。您要匹配的是唯一类别数组的大小
  • 然后,您最终将$group by null用于获取总数
这是聚合的外观(未经测试):


我尝试使用这种方法,但失败了。它给了我一个错误:“超过了$group的内存限制,但不允许外部排序。将allowDiskUse:true传递给opt-in。”可能有更好的方法来编写代码。。。你还有其他想法吗?@cacao一个$group舞台的容量限制为100MB。我没想到你会有那么多数据。请参阅,了解“Pass allowDiskUse:true to opt-in”的含义。
     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} }}  
     ])