MongoDB - группировка по побочному результату - PullRequest
0 голосов
/ 10 октября 2019

При условии, что у меня есть следующие коллекции

Клиенты

[
    {
      uuid: "first",
      culture: "it-it"
    },
    {
      uuid: "second",
      culture: "de-de"
    }
]

Транспортные средства

[
    {
      model: "mymodel",
      users: [
        {
          uuid: "first",
          isOwner: true,
          createdOn: "2019-05-15T06: 00: 00"
        }
      ]
    },
    {
      model: "mymodel",
      users: [
        {
          uuid: "first",
          isOwner: false,
          createdOn: "2019-05-15T06: 00: 00"
        },
        {
          uuid: "second",
          isOwner: true,
          createdOn: "2019-05-15T06: 00: 00"
        }
      ]
    }
]

И следующий запрос:

db.customers.aggregate([
  {
    $lookup: {
      from: "vehicles",
      let: {
        uuid: "$uuid"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$$uuid",
                "$users.uuid"
              ]
            }
          }
        },
        {
          $project: {
            model: 1,
            users: {
              $filter: {
                input: "$users",
                as: "user",
                cond: {
                  $eq: [
                    "$$user.uuid",
                    "$$uuid"
                  ]
                }
              }
            }
          }
        },
        {
          $unwind: "$users"
        },
        {
          $replaceRoot: {
            newRoot: {
              isOwner: "$users.isOwner",
              createdOn: "$users.createdOn"
            }
          }
        }
      ],
      as: "vehicles"
    }
  },
  {
    $facet: {
      "createdOn": [
        {
          $match: {
            "vehicles": {
              $elemMatch: {
                isOwner: true,
                $and: [
                  {
                    "createdOn": {
                      $gte: "2019-05-15T00: 00: 00"
                    }
                  },
                  {
                    "createdOn": {
                      $lt: "2019-05-16T00: 00: 00"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          $project: {
            culture: 1,
            count: {
              $size: "$vehicles"
            }
          }
        },
        {
          $group: {
            _id: 0,
            "total": {
              $sum: "$count"
            }
          }
        }
      ]
    }
  },
  {
    $project: {
      "CreatedOn": {
        $arrayElemAt: [
          "$CreatedOn.total",
          0
        ]
      }
    }
  }
])

Я получаю следующеерезультат:

[
  {
    "createdOn": 2
  }
]

Я бы хотел добиться следующего результата:

[
    {
        culture: "it-it",
        results: {
            "createdOn": 1
        }
    },
    {
        culture: "de-de",
        results: {
            "createdOn": 1
        }
    }
]

Но я не могу понять, где я могу сгруппироваться, чтобы получить этот результат. ,Может кто-нибудь показать мне способ сделать это?

Запрос более сложный с большим количеством метрик, так что это урезанная версия того, что у меня есть.

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

1 Ответ

0 голосов
/ 10 октября 2019

Следующий запрос может дать нам ожидаемый результат:

db.customers.aggregate([
  {
    $lookup: {
      "from": "vehicles",
      "let": {
        "uuid": "$uuid"
      },
      "pipeline": [
        {
          $unwind: "$users"
        },
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: ["$users.uuid", "$$uuid"]
                },
                {
                  $eq: ["$users.isOwner", true]
                },
                {
                  $gte: ["$users.createdOn", "2019-05-15T00: 00: 00"]
                },
                {
                  $lte: ["$users.createdOn", "2019-05-16T00: 00: 00"]
                }
              ]
            }
          }
        },
        {
          $count:"totalVehicles"
        }
      ],
      as: "vehiclesInfo"
    }
  },
  {
    $unwind: {
      "path": "$vehiclesInfo",
      "preserveNullAndEmptyArrays": true
    }
  },
  {
    $group: {
      "_id": "$culture",
      "culture": {
        $first: "$culture"
      },
      "createdOn": {
        $sum: "$vehiclesInfo.totalVehicles"
      }
    }
  },
  {
    $project: {
      "_id": 0,
      "culture": 1,
      "results.createdOn": "$createdOn"
    }
  }
]).pretty()

Выход:

{ "culture" : "de-de", "results" : { "createdOn" : 1 } }
{ "culture" : "it-it", "results" : { "createdOn" : 1 } }
...