2 votes

recherche d'un ObjectId dans un tableau

J'ai une collection de magasins et une collection d'utilisateurs avec une liste d'identifiants de magasins sous forme de chaînes.

exemple de document d'atelier :

    {
            "_id" : ObjectId("5a0c6797fd3eb67969316ce2"),
            "picture" : "http://placehold.it/150x150",
            "name" : "Genmom",
            "email" : "leilaware@genmom.com",
            "city" : "Rabat",
            "location" : {
                    "type" : "Point",
                    "coordinates" : [
                            -6.79387,
                            33.83957
                    ]
            }
    }

exemple de collecte d'utilisateurs :

{
            "_id" : ObjectId("5c04b943ff491824b806686a"),
            "email" : "ayoub.khial@gmail.com",
            "password" : "$2a$10$4Wt5Rn6udxREdXCIt3hGb.sKhKUKOlyiYKmLTjYG3SqEPKFSw9phq",
            "likedShops" : [
                    "5a0c6797fd3eb67969316ce2",
                    "5c07ada8ff49183284e509d1",
                    "5c07acc1ff49183284e509d0"
            ],
            "dislikedShops" : [ ]
}

Je veux retourner le détail des likedShops.

5voto

Anthony Winzlet Points 10216

Vous pouvez utiliser ci-dessous $lookup agrégation

db.users.aggregate([
  { "$lookup": {
    "from": "shops",
    "let": { "likedShops": "$likedShops" },
    "pipeline": [
      { "$match": { "$expr": { "$in": ["$_id", "$$likedShops"] }}}
    ],
    "as": "likedShops"
  }}
])

Ou si vos identifiants sont des chaînes de caractères, utilisez $toString l'agrégation avec le ObjectIds

db.users.aggregate([
  { "$lookup": {
    "from": "shops",
    "let": { "likedShops": "$likedShops" },
    "pipeline": [
      { "$match": { "$expr": { "$in": [{ "$toString": "$_id" }, "$$likedShops"] }}}
    ],
    "as": "likedShops"
  }}
])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X