首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改代码以完成mongodb中的聚合?

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

Stack Overflow用户
提问于 2016-04-16 22:22:36
回答 1查看 44关注 0票数 0

我在json中有一本书清单如下:

代码语言:javascript
复制
{
    "_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"
}
.......

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

举上面的例子:玛丽在“孩子”里有书,托尼在“孩子”里有书,乔在“孩子”和“喜剧”里有书。因此,我希望得到数字1,因为乔是唯一一个在不同类别出版书籍的人。

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

代码语言:javascript
复制
db.collection.aggregate([     
{ $match:{ }},     
{ $project:{ _id:0, author:1 }},     
{ $unwind:"$author" },     
{ $group:{ _id:null, count:{ $sum: 1} }}  
])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-16 22:39:01

在聚合管道中有几个错误:

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

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

代码语言:javascript
复制
     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} }}  
     ])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36670467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档