Je veux regrouper dans le tableau de {{X0}} de la collection {{X1}} en utilisant le champ {{X2}} qui est le {{X3}} contenu dans {{X4}}....

Pays

    {
      "_id": "5fbc7cc705253c2da4820425",
      "name": "USA"
    },
    {
      "_id": "5fbc7cc705253c2da4820422",
      "name": "PERU"
    },
    {
      "_id": "5fbc7cc705253c2da4820423",
      "name": "COLOMBIA"
    }

Réservation_de_voyage

    {
      "name_person": "pablo rojas",
      "countrys_id": [
        {
          "country_id": "5fbc7cc705253c2da4820425"
        },
        {
          "country_id": "5fbc7cc705253c2da4820423"
        }
      ]
    },
    {
      "name_person": "Anuel",
      "countrys_id": [
        {
          "country_id": "5fbc7cc705253c2da4820422"
        }
      ]
    },
    {
      "name_person": "Laura",
      "countrys_id": []
    }
    

Https://mongoplayground.net/p/P7JDBdUNn0F...

Je veux une sortie comme celle-ci

Sortie souhaitée:

[
    {
      "name_person":  "pablo rojas",
      "countrys":[
        {
          "_id": "5fbc7cc705253c2da4820425",
          "country": "USA"
        },
        {
          "_id": "5fbc7cc705253c2da4820423",
          "country": "COLOMBIA"
        }
      ]
    },
    {
      "name_person":  "Anuel",
      "countrys":[
        {
          "_id": "5fbc7cc705253c2da4820422",
          "country": "PERU"
        },
      ]
    }    
    {
      "name_person":  "Laura",
      "countrys":[
 
      ]
    }      
]

Mais je ne sais pas ce que je fais de mal? c'est mon code:

https://mongoplayground.net/p/P7JDBdUNn0F

0
yavg 30 nov. 2020 à 04:07

2 réponses

Meilleure réponse

Ce que vous avez fait est tellement apprécié.

  • Vous avez également besoin de la liste de tableaux vide. Par exemple: "Laura". Ainsi, lorsque vous vous détendez, le comportement par défaut est de supprimer le tableau nul ou vide preserveNullAndEmptyArrays:false. Puisque nous en avons besoin, nous devons le rendre vrai.
  • $lookup pour rejoindre des collections
  • $arrayElemAt pour obtenir le premier élément du tableau
  • $group à regrouper car nous avons déjà déconstruit le tableau en utilisant $unwind

La raison pour laquelle votre recherche ne fonctionne pas est que la variable ne correspond pas à {{X0}} et {{X1}}...

db.travel_reservation.aggregate([
  {
    $unwind: {
      path: "$countrys_id",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $lookup: {
      from: "country",
      let: {
        ci: "$countrys_id.country_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$_id",
                "$$ci"
              ]
            }
          }
        }
      ],
      as: "join",
      
    }
  },
  {
    $addFields: {
      join: {
        $arrayElemAt: [
          "$join",
          0
        ]
      }
    }
  },
  {
    $group: {
      _id: "$_id",
      countrys: {
        $push: "$join"
      },
      name_person: {
        $first: "$name_person"
      }
    }
  }
])

Fonctionnement du terrain de jeu Mongo

J'ai ces 2 collections:...

2
varman 30 nov. 2020 à 02:02

Si vous voulez exactement tous les objets du pays, essayez,

  • $llokup rejoindre country collection
  • $project pour supprimer le champ countrys_id
db.travel_reservation.aggregate([
  {
    $lookup: {
      from: "country",
      localField: "countrys_id.country_id",
      foreignField: "_id",
      as: "countrys"
    }
  },
  { $project: { countrys_id: 0 } }
])

Terrain de jeux


Deuxièmement, si vous voulez l'objet du champ countrys_id actuel, essayez,

  • $llokup rejoindre country collection
  • ajoutez un nom dans countrys, $map pour parcourir la boucle du countrys_id array et $reduce pour trouver ce nom de pays et fusionner avec l'objet actuel en utilisant $mergeObjects
db.travel_reservation.aggregate([
  {
    $lookup: {
      from: "country",
      localField: "countrys_id.country_id",
      foreignField: "_id",
      as: "country"
    }
  },
  {
    $project: {
      name_person: 1,
      countrys: {
        $map: {
          input: "$countrys_id",
          as: "c",
          in: {
            $mergeObjects: [
              "$$c",
              {
                name: {
                  $reduce: {
                    input: "$country",
                    initialValue: "",
                    in: {
                      $cond: [
                        { $eq: ["$$this._id", "$$c.country_id"] },
                        "$$this.name",
                        "$$value"
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

Terrain de jeux

1
turivishal 30 nov. 2020 à 04:41