Trouver des documents avec les tableaux ne contenant pas d'un document avec une valeur de champ dans MongoDB
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 tous les enregistrements où il n'est pas un document dans les docs bloc 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é le suivant, mais il ne me dit si il y a toutes celles qui ne correspondent pas (qui renvoie le document 1.
db.collection.find({"docs": { $not: {$elemMatch: {foo: 1 } } } })
Mise à JOUR: La requête ci-dessus est qu'ils fonctionnent réellement. Autant de fois arrive, mes données était mauvais, pas de mon code.
J'ai aussi regardé le $nin opérateur mais les exemples montrent seulement lorsque le tableau contient une liste de valeurs primitives, pas un document supplémentaire. Quand j'ai essayé de le faire avec quelque chose comme ce qui suit, il recherche le EXACTE du document plutôt que de simplement les foo domaine que je veux.
db.collection.find({"docs": { $nin: {'foo':1 } } })
Est-il de toute façon d'accomplir ceci avec les opérateurs de base?
Vous devez vous connecter pour publier un commentaire.
À l'aide de
$nin
va fonctionner, mais vous avez la syntaxe de mal. Il doit être:$nin
au lieu de$ne
? Ne pourriez-vous pas fairedb.collection.find({'docs.foo': {$ne: 1}})
? (c'est à dire la même chose, mais pas besoin de 1 à figurer dans un tableau, comme dans aedm réponse)$ne
est très bien si il n'y a qu'une seule valeur.$ne
aussi devrait être un peu plus efficace (plus rapide)Utiliser le
$ne
opérateur:Mise à jour: je déconseillerais à l'aide de
$nin
dans ce cas.{'docs.foo': {$ne: 1}}
prend tous les éléments dedocs
, et pour chacun d'eux, il vérifie si lefoo
champ est égal à 1 ou non. S'il trouve une correspondance, il rejette le document à partir de la liste des résultats.{'docs.foo': {$nin: [1]}}
prend tous les éléments dedocs
, et pour chaque élément, il vérifie si sonfoo
champ correspond à l'un des membres de la matrice[1]
. C'est un Produit cartésien, vous comparez un tableau à un autre tableau, chaque élément de chaque élément. Bien que MongoDB peut être intelligent et d'optimisation de cette requête, je suppose que vous utilisez uniquement$nin
parce que "c'est de faire quelque chose avec les tableaux". Mais si vous comprenez ce que vous faites ici, vous vous rendrez compte$nin
est superflu, et a peut-être médiocres performances.