Cet article est le troisième jour de MongoDB Advent Calendar 2013.
MongoEngine est une bibliothèque appelée ** ODM == Object Document Mapper ** qui vous permet de manipuler des documents pour des objets similaires à MongoDB. Il fait abstraction de la définition, de la récupération et du stockage du schéma de document.
L'utilisation est très similaire à l'ORM de Django, et les utilisateurs de Django pourront utiliser MongoDB sans apprendre les requêtes spécifiques à MongoDB. peut être.
Cependant, essayer de faire quelque chose en profondeur nécessite une connaissance de MongoDB.
Puisqu'il est enregistré dans pypi, installez-le avec pip.
$ pip install mongoengine
Utilisez mongoengine.connect
pour vous connecter à MongoDB. Pour vous connecter à une base de données appelée * mongotest *:
from mongoengine import connect
connect('mongotest')
Ajoutez des arguments lors de la spécification d'un hôte ou d'un port.
connect('mongotest', host='192.168.0.10', port=999)
Définissez une sous-classe qui hérite de la classe mongoengine.document.Document
. Attribuez «mongoengine.fields. *» À chaque champ. Les classes de champ sont définies avec des noms similaires aux noms d'objet python, tels que IntField et StringField.
documents.py
from mongoengine.document import Document
from mongoengine import fields
class Athlete(Document):
name = fields.StringField()
age = fields.IntField()
def __unicode__(self):
return self.name
La bonne chose à propos de MongoDB est qu'il est sans schéma, mais je trouve personnellement qu'il est plus facile de créer et d'exploiter un schéma de classe de document ==. En passant, vous pouvez travailler avec plusieurs classes de documents dans une seule collection, de sorte que les avantages d'être sans schéma ne sont pas gâchés.
Instanciez la classe Athlète et appelez la méthode save ()
.
from documents import Athlete
#Ajouter le taro yamada et le hanako yamada
athlete = Athlete(name=u"taro yamada", age=30)
athlete.save()
athlete = Athlete(name=u"hanako yamada", age=28)
athlete.save()
En regardant la commande mongo ...
$ mongo mongotest
MongoDB shell version: 2.4.6
connecting to: mongotest
> show dbs
local 0.078125GB
mongotest 0.203125GB
La base de données est créée automatiquement. La collection est
> show collections
athlete
system.indexes
> db.athlete.find()
{ "_id" : ObjectId("529db366bdbf568299123013"), "name" : "taro yamada", "age" : 30 }
{ "_id" : ObjectId("529db458bdbf568299123014"), "name" : "hanako yamada", "age" : 28 }
Et ainsi de suite, les documents sont stockés dans la collection des athlètes.
L'acquisition de documents est également effectuée auprès de la classe Athlète. Récupérons tous les enregistrements par la méthode ʻall () via la propriété ʻobjects
(qui est familière aux utilisateurs de Django).
>>> Athlete.objects.all()
[<Athlete: taro yamada>, <Athlete: hanako yamada>]
Utilisez la méthode filter ()
pour ajouter une condition de récupération.
>>> Athlete.objects.filter(age=28)
[<Athlete: hanako yamada>]
Si vous ne voulez obtenir qu'un seul document, vous pouvez utiliser la méthode get ()
.
>>> Athlete.objects.get(age=28)
<Athlete: hanako yamada>
Une exception est levée si le document n'existe pas lorsque la méthode get ()
est exécutée.
>>> Athlete.objects.get(name=u"inoki")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/key/.virtualenvs/mongoenginetest/lib/python2.7/site-packages/mongoengine/queryset/base.py", line 186, in get
raise queryset._document.DoesNotExist(msg)
documents.DoesNotExist: Athlete matching query does not exist.
Vous pouvez également utiliser la méthode count ()
pour compter le nombre de documents.
>>> Athlete.objects.all().count()
2
Pour mettre à jour le document, exécutez la méthode save ()
de l'instance. S'il n'y a pas de document, il sera ajouté, et s'il y en a, il sera mis à jour.
>>> athlete = Athlete.objects.get(name=u"taro yamada")
>>> athlete.age = 50
>>> athlete.save()
<Athlete: taro yamada>
>>> athlete.age
50
Émettez la méthode delete ()
sur une instance de la classe Athlète.
>>> hanako = Athlete.objects.get(age=28)
>>> hanako.delete()
>>> Athlete.objects.all()
[<Athlete: taro yamada>]
hanako a été supprimé :)
Si vous enchaînez par inadvertance la méthode delete ()
après la méthode ʻall () , tout disparaîtra (même si vous utilisez le
filter () `).
>>> Athlete.objects.all().delete()
>>> Athlete.objects.all()
[]
taro a également été supprimé :)
Recommended Posts