J'essaie de trouver tous les documents qui ne contiennent pas au moins un document avec une valeur de champ spécifique. Par exemple, voici un exemple de collection:
{ _id : 1,
docs : [
{ foo : 1,
bar : 2},
{ foo : 3,
bar : 3}
]
},
{ _id : 2,
docs : [
{ foo : 2,
bar : 2},
{ foo : 3,
bar : 3}
]
}
Je veux trouver chaque enregistrement où il n'y a pas de document dans le bloc docs qui ne contient pas au moins un enregistrement avec foo = 1. Dans l'exemple ci-dessus, seul le deuxième document doit être retourné.
J'ai essayé ce qui suit, mais il me dit seulement s'il y en a qui ne correspondent pas (ce qui renvoie le document 1.
db.collection.find({"docs": { $not: {$elemMatch: {foo: 1 } } } })
MISE À JOUR: La requête ci-dessus fonctionne réellement. Comme cela arrive souvent, mes données étaient erronées, pas mon code.
J'ai également regardé opérateur $ nin mais les exemples ne s'affichent que lorsque le tableau contient une liste de valeurs primitives, pas un document supplémentaire. Lorsque j'ai essayé de le faire avec quelque chose comme ce qui suit, il recherche le document EXACT plutôt que le champ foo que je veux.
db.collection.find({"docs": { $nin: {'foo':1 } } })
Existe-t-il de toute façon cela avec les opérateurs de base?
En utilisant $nin
fonctionnera, mais la syntaxe est incorrecte. CA devrait etre:
db.collection.find({'docs.foo': {$nin: [1]}})
Utilisez le $ne
opérateur:
db.collection.find({'docs.foo': {$ne: 1}})
Mise à jour: Je déconseille d'utiliser $nin
dans ce cas.
{'docs.foo': {$ne: 1}}
prend tous les éléments de docs
, et pour chacun d'eux il vérifie si le champ foo
vaut 1 ou non. S'il trouve une correspondance, il supprime le document de la liste des résultats.
{'docs.foo': {$nin: [1]}}
prend tous les éléments de docs
, et pour chaque élément, il vérifie si son champ foo
correspond à l'un des membres du tableau [1]
. C'est un produit cartésien , vous comparez un tableau à un autre tableau, chaque élément à chaque élément. Bien que MongoDB puisse être intelligent et optimiser cette requête, je suppose que vous utilisez uniquement $nin
parce que "cela a quelque chose à voir avec les tableaux". Mais si vous comprenez ce que vous faites ici, vous vous rendrez compte $nin
est superflu et a peut-être des performances inférieures.