9
votes

champs correspondants en interne à mongodb

J'ai le document suivant dans mongodb xxx

Remarque: pas une donnée réelle mais le schéma est exactement pareil.

EXIGENCE: Trouver le document qui correspond au StudentID et Etudiants.Id (ID à l'intérieur du tableau des étudiants en utilisant Single Query .

J'ai essayé le code comme ci-dessous xxx

résultat: Vide tableau, si je remplace {"étudiants": " $ StudentID "} à {" étudiants ": 33} Il renvoie le deuxième document dans le JSON ci-dessus montré.

est-il possible d'obtenir les documents de ce scénario à l'aide d'une seule requête?


0 commentaires

3 Réponses :


-1
votes

db.data.find ({étudiants: {$ elemmatch: {id: 23}}, StudentID: 23});


1 commentaires

Je crois que la question est de savoir comment trouver tous les documents où la condition est vraie (sélectionnez Document où la liste des élèves contient StudentID.)



0
votes

Malheureusement, il est impossible; (

Pour résoudre ce problème, il est nécessaire d'utiliser un $ où déclaration (Exemple: Recherche de documents encastré dans MongoDB? ),

mais $ où est restreint utilisé avec cadre d'agrégation


3 commentaires

Notez que $ où n'est pas nécessaire avec le cadre d'agrégation, cependant (comme la réponse de Wireprairie indique que vous pouvez utiliser $ projet pour créer un nouveau champ, puis utiliser $ match)


Exactement @ASYAKAMSKY, mais dans de nombreuses questions, j'observe une situation classique: comparez-la déposée et un autre champ dans une hiérarchie. Je sais que ce problème est généralement dans un mauvais modèle de données. De nombreux devs créent un modèle de stockage de données juste copier directement + Coller des stockages relationnels;)


Eh bien, pour être juste, les exigences parfois évoluent et évoluent le schéma avec cela signifie de comprendre les nouvelles exigences en premier. Ce type de solution de contournement peut être une étape intermédiaire tout en comprenant ce qui doit être ajouté au schéma à long terme.



13
votes

Si possible, je vous suggère de définir la condition lors du stockage des données afin que vous puissiez faire une vérification de la vérité rapide ( isinstudentslist code>). Il serait super rapide de faire ce type de requête.

Sinon, il existe une manière relativement complexe d'utiliser le pipeline-cadre d'agrégation pour faire ce que vous voulez dans une seule requête: P>

{
    "result" : [
         {
             "_id" : ObjectId("517b88decd483543a8bdd95b"),
             "studentId" : 23,
             "isStudentEqual" : true
         }
    ],
    "ok" : 1
}


0 commentaires