MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

l'opération mongodb $match dans $lookup pour comparer objectId ne fonctionne pas comme prévu

Essayez ceci

const { user } = req;

productsModels.aggregate([
            { $sort: { '_id': -1 } },
            { $limit: 10 },
            {
                $lookup: {
                    from: 'likes',
                    let: {productId:"$_id"},
                    pipeline: [
                        {
                            $match: {
                                $expr:{$eq:['$_id', '$$productId']}},
                                'userId': mongoose.Type.Object(user.id)
                            }
                        }
                    ],
                    as: 'liked'
                }
            },
        ]);}

Dans votre requête, deux choses manquaient

1) Conversion de l'ID utilisateur en ID d'objet mongo, nous avons donc utilisé mongoose.Types.ObjectId

2) Vous ne pouvez pas utiliser le champ de collection externe directement dans le pipeline interne pour cela, vous avez créé une variable temporaire, nous avons donc utilisé let pour déclarer et faire correspondre avec le champ interne, nous devons utiliser $expr