1

我有一个期刊文档。其中包含 journal_volumes、期刊问题和期刊文章的详细信息。我必须列出期刊以及每个期刊的卷数、期数和文章数。

这是我的文档:

{
"_id" : ObjectId("5c470fc3135edb4413b0ea24"),
"jnl_code" : "KEG",
"jnl_volumes" : [ 
    {
        "name" : "1",
        "created_date" : "2019-03-01",
        "status" : "0",
        "issue_flag" : "0",
        "jnl_issues" : [ 
            {
                "issue_name" : "1",
                "created_date" : "2019-03-04",
                "jnl_articles" : [ 
                    "test", 
                    "test2"
                ]
            }, 
            {
                "issue_name" : "2",
                "created_date" : "2019-03-04",
                "jnl_articles" : [ 
                    "a"
                ]
            }, 
            {
                "issue_name" : "3",
                "created_date" : "2019-03-04",
                "jnl_articles" : [ 
                    "b"
                ]
            }, 
            {
                "issue_name" : "3",
                "created_date" : "2019-03-05",
                "jnl_articles" : [ 
                    "Q"
                ]
            }
        ]
    }, 
    {
        "name" : "2",
        "created_date" : "2019-03-01",
        "status" : "0",
        "issue_flag" : "0",
        "jnl_issues" : [ 
            {
                "issue_name" : "1",
                "created_date" : "2019-03-05",
                "jnl_articles" : [ 
                    "W"
                ]
            }, 
            {
                "issue_name" : "1",
                "created_date" : "2019-03-05",
                "jnl_articles" : [ 
                    "S"
                ]
            }, 
            {
                "issue_name" : "1",
                "created_date" : "2019-03-05",
                "jnl_articles" : [ 
                    "R"
                ]
            }, 
            {
                "issue_name" : "1",
                "created_date" : "2019-03-05",
                "jnl_articles" : [ 
                    "R"
                ]
            }
        ]
    }, 
    {
        "name" : "3",
        "created_date" : "2019-03-05",
        "status" : "0",
        "issue_flag" : "0"
    }
]

}

我的要求是在单个查询中获取 jnl_volumes、jnl_issues 总数和 jnl_articles 总数的计数。

感谢Neil Lunn将我重定向到类似的问题(Calculate the count of nested objects with C# )。我参考了答案并写了一个查询:

db.getCollection('rvh_journals').aggregate([
{
    $project: {
        "volumes" : { "$size" : { "$ifNull" : [ "$jnl_volumes", [] ] } },
        "issues" : {  
            "$sum" : {
                "$map" : {
                    "input" : "$jnl_volumes",
                    "in": { "$size" : { "$ifNull" : [ "$$this.jnl_issues", [] ] } }
                }
            }
        },
        "articles" : {
            "$sum" : {
                "$map" : {
                    "input" : "$jnl_volumes.jnl_issues.jnl_articles",
                    "in" : { "$size" : { "$ifNull" : [ "$$this", [] ] } }
                }
            }
        }
    }
}

])

这会返回不正确的文章计数。实际文章数为 9 但查询返回 8

{
"_id" : ObjectId("5c470fc3135edb4413b0ea24"),
"volumes" : 3,
"issues" : 8,
"articles" : 8

}

4

2 回答 2

0

是的,在您对上一个问题进行编辑后,我很好奇,并注意到您的陈述不正确。

这个是对的:

db.getCollection('rvh_journals').aggregate([
  { "$project": {
    "volumes": { "$size":  "$jnl_volumes" },
    "issues": { 
      "$sum": {
        "$map": {
          "input": "$jnl_volumes",
          "in": { "$size": { "$ifNull": ["$$this.jnl_issues", [] ] } }
        }
      }
    },
    "articles": {
      "$sum": {
        "$map": {
          "input": "$jnl_volumes",
          "in": {
            "$sum": {
              "$map": {
                "input": { "$ifNull": [ "$$this.jnl_issues", [] ] },
                "in": { "$size": { "$ifNull": [ "$$this.jnl_articles", [] ] } }
              }
            }
          }
        }
      }
    }
  }}
])

回报:

{
        "_id" : ObjectId("5c470fc3135edb4413b0ea24"),
        "volumes" : 3,
        "issues" : 8,
        "articles" : 9
}

注意数组的遍历。

您可能会去阅读我在原始链接答案中使用的一些实际单词,因为我会解释说这样的嵌套数组不是一个好主意。关于为什么这不是一个好主意和采取其他方法的实用方法的更多详细信息,请参阅使用 MongoDB 更新嵌套数组

于 2019-03-05T12:14:49.267 回答
0

在此处输入图像描述

.itcount() - 显示不同的计数。需要显示在 $group 中声明的计数变量的总数 目前它基于公司显示。

于 2020-05-29T14:14:58.373 回答