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