Размер агрегации MongoDB $ на вложенном поле - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь выполнить сложную агрегацию, чтобы получить размер вложенного массива в документе в коллекции.

Вот как заново создать пример данных:

db.test.insert({
    projects: [
        {
            _id: 1,
            comments: [
                'a',
                'b',
                'c'
            ]
        },
        {
            _id: 2,
            comments: [
                'a',
                'b'
            ]
        },
        {
            _id: 3,
            comments: []
        }
    ]
})

Агрегация, которую я бы выполнил, идет здесь:

db.test.aggregate([
    // enter aggregation here
])

Вот желаемый результат:

[{
    projects: [
        {
            _id: 1,
            comment_count: 3
        },
        {
            _id: 2,
            comment_count: 2
        },
        {
            _id: 3,
            comment_count: 0
        }
    ]
}]

Я борюсь с тем, как написать это.Если я попробую следующее:

"projects.comment_count": {"$size": }

Результат вернет размер полученного массива:

[{
    projects: [
        {
            _id: 1,
            comment_count: 3
        },
        {
            _id: 2,
            comment_count: 3
        },
        {
            _id: 3,
            comment_count: 3
        }
    ]
}]

Если я попытаюсь использовать метод $ map, напримерthis:

"projects.comment_count": { 
    "$map": { 
        "input": "$projects", 
        "as": "project", 
        "in": {
            "$size": "$$project.comments"
        } 
    } 
}

Возвращает массив, который выглядит следующим образом для каждого объекта в массиве:

[{
    projects: [
        {
            _id: 1,
            comment_count: [3, 2, 0]
        },
        {
            _id: 2,
            comment_count: [3, 2, 0]
        },
        {
            _id: 3,
            comment_count: [3, 2, 0]
        }
    ]
}]

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Необходимо указать каждое поле в аргументе in агрегации $map и, наконец, использовать $sizeс массивом comments.

Примерно так

db.collection.aggregate([
  { "$project": {
    "projects": {
      "$map": {
        "input": "$projects",
        "in": {
          "_id": "$$this._id",
          "comment_count": {
            "$size": "$$this.comments"
          }
        }
      }
    }
  }}
])

Вывод

[
  {
    "projects": [
      {
        "_id": 1,
        "comment_count": 3
      },
      {
        "_id": 2,
        "comment_count": 2
      },
      {
        "_id": 3,
        "comment_count": 0
      }
    ]
  }
]
0 голосов
/ 21 сентября 2018

Вот идея с использованием $unwind, $group, а затем $push с $size.Наконец $project чтобы избавиться от этого _id:

db.collection.aggregate([
  {
    "$unwind": "$projects"
  },
  {
    $group: {
      _id: null,
      "projects": {
        $push: {
          _id: "$projects._id",
          comment_count: {
            $size: "$projects.comments"
          }
        }
      }
    }
  },
  {
    "$project": {
      "_id": 0
    }
  }
])

Вы можете увидеть результат здесь

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