2011-09-11 3 views
0

Je suis nouvelle abeille mongodb. J'ai créé un document tableau imbriqué comme celui-ci.Comment faire une requête dans le tableau imbriqué (en utilisant pymongo)

data = { 
    "title": "mongo community", 
    "description": "I am a new bee", 
    "topics": [{ 
     "title": "how to find object in array", 
     "comments": [{ 
      "description": "desc1" 
     }] 
    }, 
    { 
     "title": "the case to use ensureIndex", 
     "comments": [{ 
      "description": "before query" 
     }, 
     { 
      "description": "If you want" 
     } 
     ] 
    } 
    ] 
} 

après, il a mis dans la « communauté » db.community.insert (données)

, je voudrais accumuler « commentaires » titre sur les sujets est « comment trouver objet tableau » alors j'ai essayé,

data = db.community.find_one ({ "title": "communauté mongo", "topics.title": "comment trouver l'objet dans le tableau"})

le résultat est

>>> print data 
{ 
    u 'topics': [{ 
     u 'comments': [{ 
      u 'description': u 'desc1' 
     }], 
     u 'title': u 'how to find object in array' 
    }, 
    { 
     u 'comments': [{ 
      u 'description': u 'before query' 
     }, 
     { 
      u 'description': u 'If you want' 
     }], 
     u 'title': u 'the case to use ensureIndex' 
    }], 
    u '_id': ObjectId('4e6ce188d4baa71250000002'), 
    u 'description': u 'I am a new bee', 
    u 'title': u 'mongo community' 
} 

Je ne ai pas besoin des sujets "le cas à utiliser ensureIndex"

whould vous me donner des conseils.

thx.

Répondre

3

Il semble que vous incorporiez des rubriques sous forme de tableau dans un même document. Vous devriez essayer d'éviter de retourner des documents partiels fréquemment à MongoDB. Vous pouvez le faire avec l'argument "fields" de la méthode find, mais ce n'est pas très simple à utiliser si vous le faites fréquemment. Pour résoudre ce problème, vous pouvez essayer de faire de chaque sujet un document distinct. Je pense que ce serait plus facile pour toi aussi. Si vous souhaitez enregistrer des informations sur la "communauté" pour le forum, mettez-la dans une collection séparée. Par exemple, vous pouvez utiliser ce qui suit dans la coquille de monbodb:

// ad a forum: 
var forum = { 
       title:"mongo community", 
       description:"I am a new bee" 
      }; 
db.forums.save(forum); 

// add first topic: 
var topic = { 
       title: "how to find object in array", 
       comments: [ {description:"desc1"} ], 
       forum:"mongo community" 
      }; 
db.topics.save(topic); 

// add second topic: 
var topic = { 
       title: "the case to use ensureIndex", 
       comments: [ 
        {description:"before query"}, 
        {description:"If you want"} 
       ], 
       forum:"mongo community" 
      }; 
db.topics.save(topic); 

print("All topics:"); 
printjson(db.topics.find().toArray()); 


print("just the 'how to find object in array' topic:") 
printjson(db.topics.find({title:"how to find object in array"}).toArray()); 

En outre, voir le document Trees In MongoDB sur la conception du schéma dans MongoDB. Il arrive d'utiliser un schéma similaire à ce que vous travaillez avec et développe pour les cas d'utilisation plus avancés.

+0

Merci beaucoup Scott! –

+0

Sure chose Tsutomu. Y a-t-il autre chose que je puisse vous répondre à ce sujet? Si oui, veuillez ajouter un commentaire. Si tout est répondu, ce sera génial si vous pouvez marquer cette réponse comme la réponse. –

+0

Merci beaucoup Scott! Cela semble très simple. Je ne résoudrais pas le problème par moi-même. On m'a cru que MongoDB est un document riche. Mais je devrais l'utiliser efficacement. Merci encore! –

0

MongoDB fonctionne sur des documents, à savoir les documents de haut niveau (les choses que vous save, update, insert, find et find_one sur). Le langage de requête de Mongo vous permet de rechercher dans des objets incorporés, mais retournera, mettra à jour ou manipulera toujours un (ou plusieurs) de ces documents de haut niveau. MongoDB est souvent appelé "sans schéma", mais quelque chose de plus comme "(a) des schémas flexibles" ou "(a) des schémas par document" serait une description plus précise. C'est un cas où votre conception de schéma - ayant des sujets incorporés directement dans une communauté - ne fonctionne pas pour cette requête particulière. Cependant, il existe probablement d'autres requêtes que ce schéma prend en charge plus efficacement, comme la liste des rubriques au sein d'une communauté dans une seule requête. Vous souhaiterez peut-être prendre en compte les requêtes que vous souhaitez effectuer et redéfinir votre schéma en conséquence.

Quelques notes sur les limitations MongoDB:

  1. documents de haut niveau sont toujours retournés (en option avec un sous-ensemble de champs, comme @scott noté - voir the mongodb docs sur ce sujet)
  2. chaque document est limité à 16 mégaoctets de données (à partir de la version 1).8+), de sorte que ce schéma ne fonctionne pas bien si les communautés ont une longue liste de sujets

Pour obtenir une aide à la conception de schéma, voir the mongodb docs on schema design, Kyle Banker's video "Schema Design Basics" et Eliot Horowitz's video "Schema Design at Scale" pour une introduction, des conseils et des considérations.

+0

Merci beaucoup dcrosta, les documents ont été si utiles. –

Questions connexes