2011-07-15 4 views
3

Partie 1:Interroger et regrouper dans mongoDb?

Je (étudiant) Collection:

{ 
    sname : "", 
    studentId: "123" 
    age: "", 
    gpa: "", 
} 

im essayant d'obtenir deux clés de celui-ci:

{ 
    sname : "", 
    studentId: "123" 
} 

donc j'ai besoin d'éliminer l'âge et gpa avoir seulement le nom et studentId, comment pourrais-je faire cela?

Part2:

J'ai 'sujet' collection:

{ 
    subjectName : "Math" 
    studentId : "123" 
    teacherName: "" 
} 

je dois correspondre/combiner les touches précédentes (en part1) avec le StudentID correct, je vais donc finir avec quelque chose comme ceci:

{ 
    sname : "", 
    studentId: "123", 
    subjectName : "Math" 

} 

Comment puis-je faire cela et est-ce la bonne façon de penser pour obtenir le résultat? J'ai essayé de lire sur le groupe et mapReduce mais je n'ai pas trouvé un exemple clair.

Répondre

4

Pour répondre à votre première question, vous pouvez le faire:

db.student.find({}, {"sname":1, "studentId":1}); 

La première {} dans c'est la requête limite, qui dans ce cas comprend toute la collection. La seconde moitié spécifie les touches avec un 1 ou 0 selon que vous les voulez ou non. Ne pas mélanger inclure et exclut dans une seule requête cependant. Sauf pour quelques cas particuliers, mongo ne l'acceptera pas.

Votre deuxième question est plus difficile. Ce que vous demandez est une jointure et mongo ne supporte pas cela. Il n'y a aucun moyen de connecter les deux collections sur studentId. Vous aurez besoin de trouver tous les étudiants que vous voulez, puis utilisez ces studentIds pour trouver tous les sujets correspondants. Ensuite, vous devrez fusionner les deux résultats dans votre propre code. Vous pouvez le faire par n'importe quel pilote que vous utilisez, ou vous pouvez le faire en javascript dans le shell lui-même, mais de toute façon, vous devrez les fusionner avec votre propre code.

Editer: Voici un exemple de la façon dont vous pourriez faire cela dans le shell avec la sortie allant à une collection appelée "out".

db.student.find({}, {"sname":1, "studentId":1}).forEach(
    function (st) { 
    db.subject.find({"studentId":st.studentId}, {"subjectName":1}).forEach(
     function (sub) { 
     db.out.insert({"sname":st.sname, "studentId":st.studentId, "subjectName":sub.subjectName}); 
     } 
    ); 
    } 
); 

Si ce n'est pas des données qui changent si souvent que ça, vous pouvez simplement laisser tomber le « out » collecte et repeupler périodiquement avec ce script shell. Ensuite, votre code pourrait interroger directement depuis "out". Si les données changent fréquemment, vous devez effectuer cette opération dans votre code à la volée.

Une autre option, et peut-être mieux, consiste à inclure les données "sujet" dans la collection "étudiant" ou vice versa. Cela se traduira par une structure plus conviviale mongodb. Si vous rencontrez fréquemment ce problème de connexion, mongo n'est peut-être pas la solution idéale et une base de données relationnelle peut être mieux adaptée à vos besoins.

+1

Vous pouvez également utiliser la touche [$ dans l'opérateur] (http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24in) pour réduire le nombre de requêtes requis pour générer la table 'out'. Ceci est particulièrement important en cas de forte charge ou lors d'une interrogation sur un réseau où le temps d'aller-retour peut devenir un facteur pour un grand nombre d'étudiants. – dcrosta

1

opérateur de Mongo find() vous permet d'inclure ou d'exclure certains champs des résultats

Découvrez Field Selection dans la documentation pour plus d'informations.Vous pouvez le faire soit:

db.users.find({}, { 'sname': 1, 'studentId': 1 }); 
db.users.find({}, { 'age': 0, 'gpa': 0 }); 

pour relier votre étudiant et sous ensemble, vous pouvez soit recherche qui soumet un étudiant a séparément, comme ceci:

db.subjects.find({ studentId: 123 }); 

ou intégrer des données de sujet à chaque élève, et récupérer en même temps que le document étudiant:

{ 
    sname : "Roland Browning", 
    studentId: "123" 
    age: 14, 
    gpa: "B", 
    subjects: [ { name : "French", teacher: "Mr Bronson" }, ... ] 
} 
Questions connexes