2013-04-03 7 views
0

Je suis nouveau sur MongoDB. Voici mon problème: un utilisateur peut avoir plusieurs avatars, mais un et un seul est actif. Voici ce qu'un document utilisateur ressemble pour le moment:Quelles sont les méthodes recommandées pour gérer les références aux documents incorporés dans MongoDB?

{ 
    "_id": ObjectId("515c99f7e4d8094a87e13757"), 
    "avatars": [{ 
    "url": "http://example.com/img/photo1.jpg", 
    "width": 50, 
    "height": 50, 
    }, { 
    "active": true, 
    "url": "http://example.com/img/photo2.jpg", 
    "width": 50, 
    "height": 50, 
    }] 
} 

Cette solution est assez simple, mais il y a quelques choses que je n'aime pas:

  1. changeant l'avatar actif signifie la mise à jour de deux noyés documents
  2. Je ne suis pas sûr qu'il se comportera bien en cas d'accès simultané (+ de read_avatar change_active_avatar ou change_active + change_active) (veut-il?)
  3. la recherche de l'avatar actif nécessite une recherche séquentielle

Une autre solution serait:

{ 
    "_id": ObjectId("515c99f7e4d8094a87e13757"), 
    "active_avatar_id": 2, 
    "avatars": [{ 
    "_id": 1, 
    "url": "http://example.com/img/photo1.jpg", 
    "width": 50, 
    "height": 50, 
    }, { 
    "_id": 2, 
    "url": "http://example.com/img/photo2.jpg", 
    "width": 50, 
    "height": 50, 
    }] 
} 

Cela corrige les problèmes 1 & 2, mais pas problème 3. Et il ajoute un champ supplémentaire _id dans chaque document incorporé. De plus, quand j'insère un nouvel avatar, je dois savoir quel est le prochain _id à utiliser (à moins que j'utilise un objectId, mais c'est un identifiant de 12 octets pour seulement quelques centaines d'avatars.)

Alors encore une autre solution pourrait être le suivant:.

{ 
    "_id": ObjectId("515c99f7e4d8094a87e13757"), 
    "active_avatar": { 
    "url": "http://example.com/img/photo2.jpg", 
    "width": 50, 
    "height": 50, 
    }, 
    "extra_avatars": [{ 
    "url": "http://example.com/img/photo1.jpg", 
    "width": 50, 
    "height": 50, 
    }] 
} 

Pas beaucoup mieux que la première solution (il corrige tout problème # 3, c'est, et il est plus laid)

Toutes ces solutions fonctionnent, mais je suis à la recherche de " la bonne façon "de le faire.Toutes les idées? Et si je permets aux utilisateurs d'avoir plusieurs avatars actifs (quel que soit ce que cela signifierait)?

Merci.

+1

Un document avec des documents incorporés est vraiment juste un document. C'est mis à jour tout à la fois. Vous voudrez peut-être avoir une collection 'Users' et une collection' Avatar' (ou seulement des documents dans une seule collection). Un document utilisateur contiendrait le '_id' de' Avatar'. – WiredPrairie

+0

Je vous recommande de lire la page [this] (http://docs.mongodb.org/manual/core/data-modeling/) pour des pratiques de modélisation courantes dans MongoDB. – WiredPrairie

+0

@WiredPrairie: J'ai parcouru la documentation (ce qui est excellent btw), mais je ne suis pas sûr de la meilleure pratique pour mon exemple. Selon votre premier commentaire, mes problèmes 1,2,3 n'existent pas, donc la première option semble assez simple, elle évite le besoin d'un _id dans chaque document incorporé. Merci pour vos bons conseils. – MiniQuark

Répondre

1

Avez-vous considéré le document dans un modèle de document?

{ 
    "_id" : ObjectId("515c99f7e4d8094a87e13758"), 
    "active_avatar_id" : 2, 
    "avatars" : { 
     "1" : { 
      "url" : "http://example.com/img/photo1.jpg", 
      "width" : 50, 
      "height" : 50 
     }, 
     "2" : { 
      "url" : "http://example.com/img/photo2.jpg", 
      "width" : 50, 
      "height" : 50 
     } 
    } 
} 
Questions connexes