MongoDB Поиск Агрегация - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть коллекция парковок, как:

parking: {
   _id: xxxxxx,
   name: xxxxxx,
   vehicles: [{vehicleId: xxxxx, bid: xxxxx}...]
}

и коллекция автомобилей:

car: {
  _id: "xxxx",
  attributes: [xxxxx],
  color: "xxxx"
}

Когда я делаю Агрегация поиска :

  $lookup: {
     from: "car",
     localField: "vehicles.vehicleId",
     foreignField: "_id",  
     as: "cars"
  }

Я получаю:

parking: {
   _id: xxxxxx,
   name: xxxxxx,
   vehicles: [{vehicleId: xxxxx, bid: xxxxx}],
   cars: [car1,car2...]
}

Поэтому я борюсь с объединением массива новых автомобилей с объектами в массиве транспортных средств, которые соответствуют идентификатору. Могу ли я как-то заменить идентификатор транспортного средства на соответствующий документ автомобиля?

Я пробовал это, но групповая операция удаляет поле имени из парковки

 db.parking.aggregate([
 { "$unwind": "$vehicles" },
 { "$lookup": {
   "from": "car",
   "as": "vehicles.vehicle",
   "localField": "vehicles.vehicleId",
   "foreignField": "_id"
 }},
 { "$unwind": "$vehicles.vehicle" },
 { "$group": {
   "_id": "$_id",
   "vehicles": { "$push": "$vehicles" }
 }}
 ])

1 Ответ

1 голос
/ 13 апреля 2020

Оператор $map проще использовать, объединяя оператор $reduce.

Попробуйте:

db.parking.aggregate([
  {
    "$lookup": {
      "from": "car",
      "localField": "vehicles.vehicleId",
      "foreignField": "_id",
      "as": "cars"
    }
  },
  {
    $addFields: {
      vehicles: {
        $map: {
          input: "$vehicles",
          as: "veh",
          in: {
            bid: "$$veh.bid",
            vehicleId: {
              $reduce: {
                input: "$cars",
                initialValue: "$$veh.vehicleId",
                in: {
                  $cond: [
                    {
                      $eq: [ "$$this._id", "$$veh.vehicleId" ]
                    },
                    "$$this",
                    "$$value"
                  ]
                }
              }
            }
          }
        }
      },
      cars: "$$REMOVE"
    }
  }
])

MongoPlayground | Заменить ID автомобиля

...