2012-09-14 4 views
0

Je développe un système dans lequel les éléments peuvent être partagés avec d'autres utilisateurs via une clé d'accès. Je stocker les clés d'accès comme des champs dans un objet shareinfo (intégré dans le document de l'élément), comme indiqué ci-dessous:Affichage des champs dans un objet mongodb

shareinfo:{ 
    ........ 
    <nth key>: <permissions object - may be complex and large> 
    ........ 
} 

Lorsqu'un élément est accessible, je vérifie shareinfo.key et trouver si sa validité ou non.

Actuellement, à la liste des clés Je chargement (en Java) l'ensemble de l'objet shareinfo en mémoire et en cours d'exécution keySet() sur elle pour récupérer et remettre les clés tandis que le reste des données est gaspillée.

Voici le problème: je veux obtenir la liste des clés (à savoir les noms de champs d'objet) sans que les données d'accompagnement (car dans certains cas, les autorisations objet est sensiblement grande).

Je n'ai trouvé aucune requête dans les documents mongodb pour une telle requête. Je veux savoir si c'est possible ou pas? Ou existe-t-il un moyen optimisé de charger la liste des noms de champs dans l'application sans les valeurs de champ qui les accompagnent?

+0

Je ne crains pas. Vous pouvez vérifier l'existence d'un champ, mais vous ne pouvez pas en obtenir la liste. – Thilo

+0

Je suppose que la meilleure chose à faire serait de garder les objets d'autorisation aussi petits que possible. btw avez-vous une idée si cette chose est prévue pour le futur? –

Répondre

4

MongoDB a une conception sans schéma, ce qui signifie que n'importe quel document peut contenir des champs différents à partir de n'importe quel autre document. Pour obtenir une liste exhaustive de tous les champs de tous les documents, vous devez parcourir tous les documents de la collection et énumérer chaque champ. Pour toute collection de taille raisonnable, cela va être une opération extrêmement coûteuse.

Il y a quelques aides qui rendent ceci plus simple: Variety et schema.js. Ils vous permettent tous deux de limiter les documents inspectés, et ils rendent également compte de la couverture. Les deux font une carte/réduisent sur les collections, mais sont au moins plus simples que d'en écrire une vous-même.

+0

aucune idée comment nous pourrions faire l'énumération du conducteur de Java lui-même? Aussi, si je spécifie le document alors je suppose que l'énumération serait assez rapide et efficace .. –

+1

Je ne suis pas le plus grand dev java, mais j'ai mis en place un exemple de programme pour vous donner une démonstration de la technique. Il est trouvé à [pastie] (http://pastie.org/4758169). Il trouve essentiellement le premier enregistrement dans "yourcollection" et imprime une liste de champs clés à System.out. –

+0

Merci! Cela a fonctionné très bien ... Notre société a en effet commencé à étudier la source MongoDB pour mettre en œuvre ceci et quelques autres fonctionnalités au backend ... –

6

J'ai eu le même problème en essayant de comprendre la structure d'une base de données MongoDB existante en utilisant la coque MongoDB. Ensuite, j'ai trouvé que je peux utiliser la fonction JavaScript Object.keys() pour récupérer un tableau des champs de l'objet. (Testé avec MongoDb 2.4.2)

Object.keys(db.collection.findOne()) 
+0

Ceci est vraiment utile, et je suis surpris que ce ne soit pas très bien documenté - merci! – jayelm

+0

C'est juste les bases de JavaScript, regardez simplement la documentation JavaScript, pas mongodb. En passant, cette requête va montrer les clés du 1er document, pas toutes. –

Questions connexes