2011-06-21 4 views
2

J'ai une collection nommée Events. Chaque document Event a une collection de Participants en tant que documents incorporés.MongoDB - Interrogation de documents incorporés

Maintenant est ma question .. est-il un moyen d'interroger un Event et d'obtenir tous les Participants thats ex. Âge> 18?

Répondre

1

Lorsque vous interrogez une collection dans MongoDB, elle renvoie par défaut le document entier correspondant à la requête. Vous pouvez le découper et récupérer un seul sous-document si vous le souhaitez.

Si tout ce que vous voulez est les participants qui sont plus de 18 ans, il serait sans doute préférable de faire une des deux choses:

  1. magasin eux dans un sous-document à l'intérieur du document d'événement appelé « Plus de 18 » ou quelque chose. Insérez-les dans ce document (et éventuellement l'autre si vous le souhaitez), puis, lorsque vous interrogez la collection, vous pouvez demander à la base de données de ne renvoyer que le sous-document "Over18". L'inconvénient est que vous stockez vos participants dans deux sous-documents différents et vous devrez déterminer leur âge avant de les insérer. Cela peut ou non être réalisable en fonction de votre application. Si vous devez être capable de vérifier des âges arbitraires (c'est-à-dire parfois ses 18 mais parfois ses 21 ou 25, etc.) cela ne fonctionnera pas.

  2. Interrogez la collection et récupérez le sous-document Participants, puis filtrez-le dans votre code d'application. Malgré ce que certaines personnes peuvent croire, ce n'est pas terrible parce que vous ne voulez pas que votre base de données fasse trop de travail tout le temps. Le déchargement des calculs vers votre application pourrait réellement profiter à votre base de données, car elle peut maintenant passer plus de temps à interroger et moins de temps à filtrer. Cela conduit à une meilleure évolutivité à long terme.

+0

merci pour les suggestions :) - En ce qui concerne la suggestion 2: Est-ce que cela affecterait la performance de mon application si elle doit filtrer ex. 120.000 documents dans l'application, par rapport à le filtrer dans la DB? – ebb

+0

Probablement. Cela dépend vraiment de l'application, mais 120k documents est beaucoup. Je pense que vous devriez le comparer et voir. Si l'option 1 n'est pas possible et que l'option 2 n'est pas évolutive, vous pouvez prendre du recul et repenser la structure de votre document. –

0

Réponse courte: non. J'ai essayé de faire la même chose il y a quelques mois, mais mongoDB ne le supporte pas (au moins dans la version = 1.8). La même question a été posée dans leur groupe Google à coup sûr. Vous pouvez soit stocker les participants dans une collection séparée, soit récupérer tous les documents, puis les filtrer sur le client. Loin d'être idéal, je sais. J'essaie toujours de trouver le meilleur moyen de contourner cette limitation.

+0

n'affectera-t-il pas la performance si je les filtre sur le client, au lieu de la DB? – ebb

+0

Je pense que cela dépend du nombre de documents avec lesquels vous travaillez. RAM est très important ici, mongo garde les documents en mémoire et essaie d'utiliser la RAM disponible, plus vous en avez, moins les opérations du système de fichiers que mongo doit effectuer. De toute façon, il n'y a rien que vous puissiez faire, ce que vous voulez faire n'est actuellement pas supporté. –

0

Pour référence future: Ce sera possible dans MongoDB 2.2 en utilisant le nouveau cadre d'agrégation, en agrégeant comme ceci:

db.events.aggregate(
    { $unwind: '$participants' }, 
    { $match: {'age': {$gte: 18}}}, 
    { $project: {participants: 1} 
) 

Ceci renvoie une liste de documents n où n est le nombre de participants> 18 où chaque entrée ressemble à ceci (notez que les « participants » champ de tableau contient désormais une seule entrée à la place):

{ 
    _id: objectIdOfTheEvent, 
    participants: { firstName: 'only one', lastName: 'participant'} 
} 

Il pourrait probablement même être aplati sur le serveur à r Ecrivez une liste de participants. Voir le officcial documentation pour plus d'informations.

Questions connexes