Как использовать совокупную карту и фильтр для нескольких массивов в Mongodb - PullRequest
0 голосов
/ 22 апреля 2020

Здесь у меня есть два массива,

 Usercar = [{
            parentId :001
            cars:[
                   {_id: 1, name: bmw, color: red},
                   {_id: 2, name: Ford, color: black},
                   {_id: 3, name: Volkswagen, color: black},
                 ]
              }]


 Userfavorite = 
               [{
                  parentId :001,
                  favoriteCars:[1,3] //mongoose.Types.ObjectId
               }]

Я хочу показать свои любимые автомобили, используя агрегат mongodb, вот мой код

let carsId= [1,3];


    {$match: {
        parentId :001
    }},
    {
        $project:{
            cars:{
                $filter:{

                        input:"$cars",
                        as :'cars',
                        cond:{ $eq :["$$cars._id", mongoose.Types.ObjectId('1')]}
                      //cond:{ $eq :["$$cars._id", carsId]}
                }
            }
        }
    }

приведенный выше код работает только при передаче single carsId, я хочу, чтобы пользователь любил детали автомобилей из коллекции Usercar, как это сделать в агрегате mongodb?

1 Ответ

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

Один из возможных агрегатов, который мог бы это сделать:

  • агрегат в коллекции Usercar
  • поиск соответствующего документа из коллекции Userfavorite
  • , если есть несколько избранных документов, объедините их в один массив избранных
  • уменьшите коллекцию автомобилей, чтобы найти те, которые соответствуют избранным, и добавьте в массив
db.Usercar.aggregate([
  {$lookup: {
      from: "Userfavorite",
      localField: "parentId",
      foreignField: "parentId",
      as: "favorite"
  }},
  {$set: {
      favorite: {
        $arrayElemAt: [
          {$concatArrays: "$favorite.favoriteCars"},
          0
        ]
      }
  }},
  {$addFields: {
      favoriteCarDetails: {
        $filter: {
          input: "$cars",
          cond: {
            $in: [
              "$$this._id",
              "$favorite"
            ]
          }
        }
      }
  }}
])

игровая площадка

...