4 votes

Requête d'agrégation pour peupler

Je veux utiliser l'agrégation MongoDB pour peupler users dans comments. Je peux facilement l'utiliser pour peupler createdBy avec l'opérateur $lookup.

Ma question est y a-t-il un moyen d'utiliser peut-être l'opérateur $each dans l'agrégation ou quelque chose comme ça pour peupler user dans les commentaires?

Je l'ai essayé avec Mongo 3.2 mais quelque part j'ai lu que ce sera une nouvelle fonctionnalité pour quelque chose comme ça dans 3.4? Je veux éviter d'utiliser un $unwind et des $groupes (j'ai réussi à le faire) et des choses similaires afin que la requête ne devienne pas du code spaghetti.

utilisateurs:

{
    "_id" : ObjectId("582c31d4afd9252c8515a88b"),
    "fullName": "test1"
},
{
    "_id" : ObjectId("582c3db0afd9252c8515a88d"),
    "fullName": "test2"
}

et posts:

{
    "_id" : ObjectId("5829cac7e9c0994d3db718f8"),
    "imgUrl": "images/test.jpg",
    "createdBy": ObjectId("582c31d4afd9252c8515a88b"),
    "comments": [
        {
            "_id" : ObjectId("5829cab8e9c0994d3db718f7"),
            "content": "blabla",
            "user": ObjectId("582c31d4afd9252c8515a88b")
        }
    ]
}

sortie attendue:

{
    "_id" : ObjectId("5829cac7e9c0994d3db718f8"),
    "imgUrl": "images/test.jpg",
    "createdBy": ObjectId("582c31d4afd9252c8515a88b"),
    "comments": [
        {
            "_id" : ObjectId("5829cab8e9c0994d3db718f7"),
            "content": "blabla",
            "user": {
                        "_id" : ObjectId("582c31d4afd9252c8515a88b"),
                        "fullName": "test1"
                    }
        }
    ]
}

1voto

Anish Agarwal Points 1173

Si vous souhaitez utiliser la fonction d'agrégation de mongodb, vous pouvez utiliser la solution ci-dessous.

    db.getCollection('posts').aggregate([
    {"$unwind":{"path":"$comments","preserveNullAndEmptyArrays":true}},
    { $lookup:
            {
                from: 'users',
                localField: 'comments.user',
                foreignField:'_id',
                as: 'comments.user'
            }
    },
    {"$unwind":{"path":"$comments.user","preserveNullAndEmptyArrays":true}},
    {
            $group : {
                _id : "$_id",
                comments : {$push : "$comments"},
                imgUrl : {$first : "$imgUrl"},
                createdBy : {$first : "$createdBy"}
            }
    }

])

Assurez-vous d'avoir la version 3.2.8 ou supérieure de mongodb pour utiliser l'option $lookup

0voto

Vaibhav Patil Points 527

Utilisez la méthode de peuplement de mongoose.

db.collections.find({}).populate([{path:"comments.user"}]).

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