Общее количество внутренних массивов в mongodb - PullRequest
1 голос
/ 05 марта 2019

У меня есть журнал док. Который содержит подробную информацию о 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 в одном запросе.

Благодаря Нейлу Ланну , чтобы перенаправить меня на аналогичный вопрос ( Рассчитать количество вложенных объектов с помощью 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
* *} Тысяча двадцать-один

1 Ответ

0 голосов
/ 05 марта 2019

Да, мне стало любопытно после того, как вы отредактировали предыдущий вопрос, и заметил, что ваше утверждение неверно.

Это правильно:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...