2 votes

Sélectionner les documents dont toutes les valeurs d'un champ de tableau existent dans un autre tableau

Je ne savais pas trop comment intituler ce texte !

J'ai donc un tableau d'identifiants de produits

var productIds = [139,72,73,1,6]

Et un ensemble de documents de clients dans MongoDB

{
    name: 'James',
    products: [ 73, 139 ],
    _id: 5741cff3f08e992598d0a39b
}

{
    name: 'John',
    products: [ 72, 99 ],
    _id: 5741d047f08e992598d0a39e
}

J'aimerais trouver des clients lorsque tous leurs produits apparaissent dans le tableau des ID de produits (productIds).

J'ai essayé :

'products' : {
    '$in': productIds
}

Mais cela renvoie John, même si 99 n'existe pas dans la liste des identifiants de produits.

J'ai également essayé :

'products' : {
    '$all': productIds
}

Ce qui ne rapporte rien car aucun des clients n'a TOUS les produits.

Existe-t-il un moyen d'obtenir ce dont j'ai besoin en une seule requête ou vais-je devoir effectuer un traitement post-requête ?

J'ai également essayé

'products': {
    '$in': productIds,
    '$not': {
        '$nin': productIds
    }
}

mais cela semble également renvoyer les clients lorsque les identifiants des produits ne correspondent pas tous.

2voto

user3100115 Points 15249

Vous pouvez le faire en utilisant la fonction .aggregate() et la méthode $redact de l'opérateur. Dans votre $cond vous devez utiliser les expressions $setIsSubset afin de vérifier si tous les éléments du tableau "products" se trouvent dans "productIds". En effet, il n'est pas possible d'utiliser $in dans l'expression conditionnelle

var productIds = [139,72,73,1,6];
db.customers.aggregate([ 
    { "$redact": { 
        "$cond": [ 
            { "$setIsSubset": [ "$products", productIds ] },
            "$$KEEP",
            "$$PRUNE" 
        ] 
    }} 
])

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