2011-11-08 4 views
2

J'apprécierais si quelqu'un pouvait répondre à mes questions de débutant MongoDB.sur les objets _id et imbriqués

  1. Quel sera les conséquences si le champ _id attribué par l'utilisateur ne sera pas unique dans DB ou collection? Dans quelle étendue l'unicité est-elle vraiment nécessaire (et quelle est la portée pour les objets imbriqués)?

  2. Est-il possible de changer (remplacer) _id (et son type) pour l'ensemble des documents de la collection? Quelle est la différence (dans la gestion par moteur DB) entre les objets imbriqués lorsque je stocke juste comme des objets json (voir ci-dessous - A) ou comme des documents incorporés avec _id (B)?

    A) {book: _id:.. chapters[{json object has not _id},{}]}

    B) {book: _id:.. chapters[{_id:... },{}]}

    est la différence juste en présence _id et l'indexation ou quelque chose de plus profond? Comment puis-je convertir "just json objects" (sans _id) en documents incorporés avec _id?

Répondre

2

Quel sera les conséquences si le champ _id attribué par l'utilisateur ne sera pas unique dans DB ou collection? Dans quelle étendue l'unicité est-elle vraiment nécessaire (et quelle est la portée pour les objets imbriqués)?

L'unicité est trop importante dans tout ensemble de données, car vous avez besoin d'un moyen d'identifier vos données par une identité. Les identifiants uniques sont la clé pour cela.

Et c'est vraiment important lorsque vous définissez un index unique. Il sera vissé lorsque vous essayez d'ajouter une clé en double dans l'index unique.

Est-il possible de changer (remplacer) _id (et son type) pour l'ensemble des documents dans la collection? Non, ce n'est pas possible de manière directe, vous devez copier les données du document dans la collection temporaire et les réinsérer dans la collection d'origine avec les nouveaux identifiants.

Quelle est la différence (dans la manipulation par le moteur DB) entre les objets imbriqués quand je stocke comme des objets JSON (voir ci-dessous - A) ou documents incorporés avec _id (B)?

Les objets incorporés sont ceux nativement pris en charge par mongodb, les objets faisant référence seront traitées manuellement par votre code pour la plupart par les ODMs (comme MongoId rubis)

Depuis que vous avez demandé la différence, les documents incorporés sont traités comme un autre champ dans le document afin que vous puissiez l'interroger, vous pouvez l'indexer et sera retourné dans le cadre du document.

Mais les documents de référence sont entièrement un document distinct. Vous ne pouvez pas l'interroger directement à partir du document parent et donc de l'indexation.Au lieu de cela, vous devez écrire la logique de l'application pour stocker les identifiants et les interroger manuellement depuis l'application. Comment puis-je convertir "juste des objets json" (sans _id) en documents intégrés avec _id?

Votre hypothèse est fausse. Les documents incorporés ont des identifiants. Il sera généré automatiquement lorsque vous en créez un.

EDIT:

Mes hypothèses ont eu tort dans ce domaine. Mongodb ne génère pas automatiquement les identifiants pour les documents incorporés. Mais certains ODM comme Mongoid génèrent aussi des identifiants pour les documents incorporés.

+0

Merci pour votre réponse, Ramesh. Mais je ne me suis pas contenté des objets sans. Vous dites que tous les objets {} auront _id automatiquement? MongoidBook.new ({: title => "NewBook",: bref => {: history => "ancien"}, éléments: [{: name => "Alex"}]}) objet bref et élément [0] ne pas avoir et _id champ. Peut-être que je me méprends quelque chose? – WHITECOLOR

+0

@WHITECOLOR, c'est étrange, allez-vous mettre à jour votre message avec votre définition de modèle ... et quel pilote vous utilisez? – RameshVel

+0

Bien dans Rubby J'ai le modèle mongoïde de définition seulement pour l'objet de collection de livre. Mais j'ai le même résultat pour l'insert standard de la console Mongo: books.insert ({title: "SuperBook", bref: {history: "new"}, items: [{name: "Alex"}]} - bref et l'élément est sans _id – WHITECOLOR