Как объединить эти два отдельных агрегатных запроса в один запрос? - PullRequest
1 голос
/ 30 января 2020

Я опубликовал два вопроса относительно запросов агрегации в пн go.

Вопрос 1 Получает все обязанности по конкретному c человеку

Вопрос 2 Получает все хлопоты для всех людей по конкретному c порядковому номеру (дня)

Теперь, однако Я хотел бы объединить оба этих запроса в один запрос. Возврат только работы по дому для определенного c человека в указанный c день .

Вот то, что у меня есть до сих пор:

        ChoreChart.aggregate([
            { "$match": { "affiliation": affiliation, "year": weekYear, "weekNumber": weekNumber } },
            { "$addFields": {
              "chart": {
                "$map": {
                  "input": "$chart",
                  "as": "cc",
                  "in": {
                    "_id": "$$cc._id",
                    "ordinal": "$$cc.ordinal",
                    "ordinalString": "$$cc.ordinalString",
                    "chorePerson": {
                      "$filter": {
                        "input": "$$cc.chorePerson",
                        "as": "dd",
                        "cond": 
                            { 
                            "$and": [ 
                                {"$eq": ["$$dd.personID", personID]},
                                {"$eq": ["$$cc.ordinal", ordinal ]}
                            ] }                        
                      }
                    }
                  }
                }
              }
            }}
          ])

Это то, что я получаю за порядковый номер 4, однако, мои выходные данные включают порядковые числа, которые меня не интересуют.

[
  {
    "_id": "5e2d482cd8593e00162d0568",
    "affiliation": "800_800",
    "year": 2020,
    "month": "January",
    "weekNumber": 5,
    "weekStart": "01/26/2020",
    "weekEnd": "02/01/2020",
    "chart": [
      {
        "_id": "5e330310c66e9e4084cda785",
        "ordinal": 0,
        "ordinalString": "Sunday",
        "chorePerson": []
      },
      {
        "_id": "5e330310c66e9e4084cda783",
        "ordinal": 1,
        "ordinalString": "Monday",
        "chorePerson": []
      },
      {
        "_id": "5e330310c66e9e4084cda780",
        "ordinal": 2,
        "ordinalString": "Tuesday",
        "chorePerson": []
      },
      {
        "_id": "5e330310c66e9e4084cda77e",
        "ordinal": 3,
        "ordinalString": "Wednesday",
        "chorePerson": []
      },
      {
        "_id": "5e330310c66e9e4084cda77c",
        "ordinal": 4,
        "ordinalString": "Thursday",
        "chorePerson": [
          {
            "_id": "5e330310c66e9e4084cda77d",
            "person": "Jo",
            "personID": "5e2890268c63351b7c07dc26",
            "phone": "8008008001",
            "chore": "DC 1",
            "choreID": "5e2929cf285338cb8cf375fc"
          },
          {
            "_id": "5e330310c66e9e4084cda77e",
            "person": "Jo",
            "personID": "5e2890268c63351b7c07dc26",
            "phone": "8008008001",
            "chore": "DC 2",
            "choreID": "5e2929cf285338cb8cf375fd"
          }
        ]
      },
      {
        "_id": "5e330310c66e9e4084cda77a",
        "ordinal": 5,
        "ordinalString": "Friday",
        "chorePerson": []
      },
      {
        "_id": "5e330310c66e9e4084cda778",
        "ordinal": 6,
        "ordinalString": "Saturday",
        "chorePerson": []
      }
    ],
    "date": "2020-01-30T16:23:44.713Z",
    "__v": 0
  }
]

Это - это то, что я действительно хочу:

[
  {
    "_id": "5e2d482cd8593e00162d0568",
    "affiliation": "800_800",
    "year": 2020,
    "month": "January",
    "weekNumber": 5,
    "weekStart": "01/26/2020",
    "weekEnd": "02/01/2020",
    "chart": [
      {
        "_id": "5e330310c66e9e4084cda77c",
        "ordinal": 4,
        "ordinalString": "Thursday",
        "chorePerson": [
          {
            "_id": "5e330310c66e9e4084cda77d",
            "person": "Jo",
            "personID": "5e2890268c63351b7c07dc26",
            "phone": "8008008001",
            "chore": "DC 1",
            "choreID": "5e2929cf285338cb8cf375fc"
          },
          {
            "_id": "5e330310c66e9e4084cda77e",
            "person": "Jo",
            "personID": "5e2890268c63351b7c07dc26",
            "phone": "8008008001",
            "chore": "DC 2",
            "choreID": "5e2929cf285338cb8cf375fd"
          }
        ]
      }
    ],
    "date": "2020-01-30T16:23:44.713Z",
    "__v": 0
  }
]

1 Ответ

1 голос
/ 30 января 2020

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

ChoreChart.aggregate([
    { "$match": { "affiliation": affiliation, "year": weekYear, "weekNumber": weekNumber } }, {
        "$addFields": {
            "chart": {
                "$map": {
                    /** $filter in input to retain only objects in array that match ordinal filter */
                    "input": { $filter: { input: '$chart', as: 'c', cond: { "$eq": ["$$c.ordinal", ordinal] } } },
                    "as": "cp",
                    "in": {
                        /** $mergeObjects to merge chorePerson filtered array field on each 'chart.chorePerson' */
                        $mergeObjects: ['$$cp', { chorePerson: { $filter: { input: '$$cp.chorePerson', as: 'each', cond: { "$eq": ["$$each.personID", personID] } } } }]
                    }
                }
            }
        }
    }
 ])

Тест: MongoDB-Playground

...