Агрегировать вложенные документы, фильтровать их по списку идентификаторов и группировать значения по идентификатору - PullRequest
0 голосов
/ 29 октября 2019

У меня есть список моно ObjectIds, которые мне нужно отобразить, назначить некоторые ответы (которые могут существовать или не существовать) для этого идентификатора, а затем сгенерировать среднее значение доступности на основе ответов. Например, у меня есть список ObjectIds, которые ссылаются на Users:

["5d978d372f263f41cc624727", "5d978d372f263f41cc624728", "5d978d372f263f41cc624729"]

и агрегированный список Events, который содержит поддокумент employeeResponses, который, если они ответили, записывает свои_id, response и любое событие notes:

[
  {
    ...
    employeeResponses: [
      {
        _id: "5d978d372f263f41cc624727",
        response: "I want to work.",
        notes: ""
      },
      {
        _id: "5d978d372f263f41cc624728",
        response: "Available to work.",
        notes: ""
      }
    ]
  },
  {
    ...
    employeeResponses: [
      {
        _id: "5d978d372f263f41cc624727",
        response: "I want to work.",
        notes: ""
      },
      {
        _id: "5d978d372f263f41cc624728",
        response: "Prefer not to work.",
        notes: ""
      }
    ]
  },
  {
    ...
    employeeResponses: [
      {
        _id: "5d978d372f263f41cc624727",
        response: "Not available to work.",
        notes: ""
      },
      {
        _id: "5d978d372f263f41cc624729",
        response: "Not available to work.",
        notes: ""
      },
    ]
  }
]

Мне нужно назначить их ответ (или отсутствие ответа) их идентификатору в массиве responses:

[
  {
    "_id": "5d978d372f263f41cc624727",
    "responses": ["I want to work.", "I want to work.", "Not available to work."]
  },
  {
    "_id": "5d978d372f263f41cc624728",
    "responses": ["Available to work.", "Prefer not to work.", "No response."] 
  }
  {
    "_id": "5d978d372f263f41cc624729",
    "responses": ["No response.", "No response.", "Not available to work."] 
  }
]

Затем, основываясь на их ответе, сгенерировать среднее значение доступности участника ( доступно : ["I want to work.", "Available to work"]; недоступно : ["Prefer not to work.", "Not available to work.", "No response."]):

[
  {
    "_id": "5d978d372f263f41cc624727",
    "availability": 66
  },
  {
    "_id": "5d978d372f263f41cc624728",
     "availability": 33,
  }
  {
    "_id": "5d978d372f263f41cc624729",
     "availability": 0,  
  }
]

С помощью @mickl я могу агрегировать ответы для 1 ObjectId , но я изо всех сил пытаюсь расширить его до списка ObjectIds без сопоставления идентификаторов и агрегирования для пользователя -- который кажется очень неэффективным и дорогостоящим.

1 Ответ

1 голос
/ 29 октября 2019

Вы можете попробовать это:

Исходный пример: https://mongoplayground.net/p/_pDaErcuvkP

Скорректированный запрос в https://mongoplayground.net/p/oURNxgNiprl:

    db.collection.aggregate([
  {
    $unwind: {
      path: "$employeeResponses",          
    }
  },
  {
    "$group": {
      _id: "$employeeResponses._id",
      "availability": {
        "$sum": {
          "$cond": [
            {
              "$in": [
                "$employeeResponses.response",
                [
                  "Available to work.",
                  "I want to work."
                ]
              ]
            },
            1,
            0
          ]
        }
      }
    }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...