Как найти и посчитать в MongoDB для конкретных предметов?

Я хотел бы подсчитать общее количество ответов каждого типа, связанных с каждым идентификатором, в следующем результате JSON, который я извлекаю из MongoDB:

{
  "test": [
    {
      "ID": 4, 
      "response": "A"
    }, 
    {
      "ID": 4, 
      "response": "B"
    }, 
    {
      "ID": 1, 
      "response": "A"
    }, 
    {
      "ID": 3, 
      "response": "B"
    }, 
    {
      "ID": 2, 
      "response": "C"
    }
  ]
}
// and so on...

Так, например, я хотел бы структурировать JSON примерно так:

{
    "test": [
        {
            "ID": 4,
            "A": 1,
            "B": 1
        },
        {
            "ID": 3,
            "B": 1
        },
        {
            "ID": 2,
            "C": 1
        },
        {
            "ID": 1,
            "A": 1
        }
    ]
}

Мой запрос выглядит примерно так, потому что я просто тестировал и пытался подсчитать ответы только для идентификатора 4.

surveyCollection.find({"ID":4},{"ID":1,"response":1,"_id":0}).count():

Но я получаю следующую ошибку: TypeError: 'int' object is not iterable

1 ответ

Решение

Что вам нужно, это использовать "структуру агрегации"

surveyCollection.aggregate([
    {"$unwind": "$test" }, 
    {"$group": {"_id": "$test.ID", "A": {"$sum": 1}, "B": {"$sum": 1}}},
    {"$group": {"_id": None, "test": {"$push": {"ID": "$ID", "A": "$A", "B": "$B"}}}}
])

Из пимонго 3.х aggregate() метод возвращает CommandCursor над результирующим набором, поэтому вам может понадобиться сначала преобразовать его в список.

In [16]: test
Out[16]: <pymongo.command_cursor.CommandCursor at 0x7fe999fcc630>

In [17]: list(test)
Out[17]: 
[{'_id': None,
  'test': [{'A': 1, 'B': 1},
   {'A': 1, 'B': 1},
   {'A': 1, 'B': 1},
   {'A': 2, 'B': 2}]}]

использование return list(test) вместо

Другие вопросы по тегам