【问题标题】:Inner array total count in mongodbmongodb中的内部数组总数
【发布时间】:2020-05-29 22:14:58
【问题描述】:

我有一个期刊文档。其中包含 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

}

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

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

    这个是对的:

    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
    }
    

    注意数组的遍历。

    您可能会去阅读我在that original linked answer 上使用的一些实际单词,因为我会解释说像这样嵌套数组不是一个好主意。 Updating a Nested Array with MongoDB

    【讨论】:

      【解决方案2】:

      enter image description here

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-01
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        • 2011-10-07
        • 2014-02-25
        相关资源
        最近更新 更多