Mongodb requête avec des champs dans les mêmes documents
J'ai à côté json.
{
"a1": {"a": "b"},
"a2": {"a": "c"}
}
Je veux demander tous les documents où a1 pas égale à a2 dans le même document.
Comment je peux faire?
- Répondre à cette question ici: stackoverflow.com/questions/4442453/...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
$where
:Cependant, être conscient que ce ne sera pas très rapide, car il aura à faire tourner le moteur de script java et de réitérer chaque document et de vérifier l'état de chacun.
Si vous avez besoin de faire cette requête pour les grandes collections, ou très souvent, il est préférable d'introduire un dénormalisée drapeau, comme
areEqual
. Toutefois, ce faible sélectivité des champs ne produisent pas un bon indice de performance, car il candidat est toujours grande.Pour éviter JavaScript utiliser l'agrégation de cadre:
Sur notre serveur de développement, l'équivalent JavaScript requête est 7x plus de temps à compléter.
Mise À Jour (10 Mai 2017)
Je viens de réaliser que ma réponse n'a pas répondu à la question, qui voulait des valeurs qui ne sont pas égales (parfois, je suis vraiment lent). Ce sera le travail pour que:
$ne
pourrait être utilisé à la place de$eq
si l'état match a été changé pourtrue
mais je trouver de l'aide$eq
avecfalse
pour être plus intuitive.$addFields
n'étais pas introduit jusqu'à ce v3.4 et nous étions encore à l'aide de la v3.2 quand j'ai répondu. Si vous avez le temps d'écrire une réponse à l'aide de$addFields
veuillez le faire! Nous sommes toujours à l'aide de la v3.2 malheureusement.mise à jour
à l'aide de la nouvelle $expr opérateur disponible de mongo 3.6 vous pouvez utiliser des expressions à trouver requête comme ceci:
Bien que ce commentaire résout le problème, je pense qu'un meilleur match pour ce cas d'utilisation serait d'utiliser $addFields opérateur disponible à partir de la version 3.4 au lieu de $projet.
MongoDB utilise Javascript dans le contexte, de sorte
serait
false
.Donc, pour comparer chaque vous auriez à a1.a == a2.un
Pour ce faire, dans MongoDB, vous utiliserez l' $opérateur où
Cela suppose que chaque document incorporé aura une propriété "un". Si ce n'est pas le cas, les choses deviennent plus compliquées.
Merci à tous pour la résolution de mon problème -- concernant les réponses de la personne qui utilise l'ensemble des(), une chose qui me troublait au premier abord est que $eq (ou $ou beaucoup d'autres opérateurs) a une signification différente selon l'endroit où il est utilisé. Dans un find(), ou l' $match de la phase d'agrégation, $eq prend une valeur unique, et sélectionne les documents correspondants:
Toutefois, dans le $projet de la phase d'agrégation, $eq prend un Tableau de 2 expressions, et fait un nouveau champ avec la valeur vrai ou faux:
En passant, voici la requête que j'ai utilisé dans mon projet pour trouver tous les éléments dont la liste des articles liés (à cause d'un bug) lié à eux-mêmes: