2011-03-09 4 views
0

Je veux stocker une valeur de type hachage dans mongodb.Puis-je mettre plusieurs clés dans une collection de mongodb

Il y a deux collection: personne et travail. Une personne a quelques œuvres avec la quantité. Work store dans l'autre collection avec plus de détails (peut-être référence les autres collections).

par ex. Personne (Jim) a un travail (a) et trois travaux (b).

// Person 
{ 
    _id: "4d772583c186233352000001" 
    name: "Jim" 
    works: { 
     "4d772583c186233352000002": 1 
     "4d772583c186233352000003": 3 
     ... 
    } 
} 

// Work 
{ 
    _id: "4d772583c186233352000002" 
    title: "Make cake" 
    finished_at: ... 
} 
{ 
    _id: "4d772583c186233352000003" 
    title: "Make iPhone" 
    finished_at: ... 
} 
... 

Si je stocke les propriétés de la personne comme ci-dessus. Le chemin de la clé de la personne inclura l'identifiant du travail et augmentera encore et encore. Est-ce que c'est juste?

+0

Dans le projet Rich-Web. Nous avons besoin de sérialiser les données du serveur au client. Le premier style de données deviendra un dictionnaire. Sinon, nous devons faire face à un tableau et à un dictionnaire. – colder

Répondre

1

Je ne suis pas entièrement sûr de comprendre la vraie question ici. Demandez-vous une deuxième opinion sur votre conception de schéma? Si oui, voici le mien est:

Il n'y a absolument rien de mal à garder les relations entre les collections de documents à l'aide id: s comme vous l'avez fait. Parfois, c'est le bon (et le seul) moyen d'y parvenir, même si vous devez assumer la responsabilité de maintenir vous-même les relations/références puisque, comme vous le savez probablement, mongoDB ne vous aidera pas.

Il est un peu difficile pour moi, cependant, de comprendre vos cas d'utilisation simplement en regardant le schéma exemple ci-dessus, mais ce qui attire mon oeil est l'objet des travaux.

Je pense que vous serez mieux en utilisant un tableau - peut-être comme ceci:

works: [ 
     { "4d772583c186233352000002": 1 }, 
     { "4d772583c186233352000003": 3 } 
] 

De cette façon, vous aurez un meilleur soutien de mongo dans le maintien de vos références, en utilisant par exemple la traction $ et pousser $ les opérateurs.

Mais je me demande aussi sur l'utilisation de la référence identifiant étranger comme une clé dans l'objet de référence de travail. Pour plus d'objets idiomatiques, considérez ceci:

works : [ 
    { work_id: "4d772583c186233352000002", quantity: 1 }, 
    { work_id: "4d772583c186233352000003", quantity: 3 } 
] 

Est-ce que cela aide?

+0

Je m'inquiète de la clé est mutable. Si j'ai de grandes données. Est-ce que mongodb va ralentir? Je n'arrive pas à imaginer comment créer un index pour eux. – colder

+0

Je ne comprends pas ce que vous voulez dire à propos de la clé étant mutable. Évidemment, plus vous mettez de données, plus le mongo sera lent. Mais vous pouvez avoir de très grandes quantités de documents de ces types avant que cela ne soit visible (sauf si vous avez des exigences de performance très spécifiques). Assurez-vous simplement que vos requêtes utiliseront vos index. A propos de l'indice, si vous voulez dire que vous allez vouloir interroger une personne qui est titulaire d'une référence à un travail spécifique, vous pouvez facilement le faire en ajoutant un index sur « works.works_id », 'db.persons.ensureIndex ({"works.works_id": 1}) ' – svjson

Questions connexes