Dieser Artikel ist der dritte Tag von MongoDB Adventskalender 2013.
MongoEngine ist eine Bibliothek, mit der Sie Dokumente für MongoDB-ähnliche Objekte mit ** ODM == Object Document Mapper ** verwalten können. Es abstrahiert die Definition, den Abruf und die Speicherung von Dokumentschemata.
Die Verwendung ist dem ORM von Django sehr ähnlich, und Django-Benutzer können MongoDB verwenden, ohne MongoDB-spezifische Abfragen zu lernen. vielleicht.
Der Versuch, etwas gründlich zu tun, erfordert jedoch Kenntnisse in MongoDB.
Da es in pypi registriert ist, installieren Sie es mit pip.
$ pip install mongoengine
Verwenden Sie mongoengine.connect
, um eine Verbindung zu MongoDB herzustellen. So stellen Sie eine Verbindung zu einer Datenbank mit dem Namen * mongotest * her:
from mongoengine import connect
connect('mongotest')
Fügen Sie Argumente hinzu, wenn Sie einen Host oder Port angeben.
connect('mongotest', host='192.168.0.10', port=999)
Definieren Sie eine Unterklasse, die von der Klasse mongoengine.document.Document
erbt. Weisen Sie jedem Feld mongoengine.fields. *
Zu. Feldklassen werden mit Namen definiert, die Python-Objektnamen ähnlich sind, z. B. IntField und 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
Das Gute an MongoDB ist, dass es schemenlos ist, aber ich persönlich finde es einfacher, ein Schema für die Dokumentklasse == zu erstellen und zu betreiben. Abgesehen davon kann eine Sammlung mit mehreren Dokumentklassen arbeiten, sodass die Vorteile einer schemenlosen Ausführung nicht beeinträchtigt werden.
Instanziieren Sie die Athletenklasse und rufen Sie die Methode "save ()" auf.
from documents import Athlete
#Fügen Sie Taro Yamada und Hanako Yamada hinzu
athlete = Athlete(name=u"taro yamada", age=30)
athlete.save()
athlete = Athlete(name=u"hanako yamada", age=28)
athlete.save()
Blick auf den Mongo-Befehl ...
$ mongo mongotest
MongoDB shell version: 2.4.6
connecting to: mongotest
> show dbs
local 0.078125GB
mongotest 0.203125GB
Die Datenbank wird automatisch erstellt. Die Sammlung ist
> show collections
athlete
system.indexes
> db.athlete.find()
{ "_id" : ObjectId("529db366bdbf568299123013"), "name" : "taro yamada", "age" : 30 }
{ "_id" : ObjectId("529db458bdbf568299123014"), "name" : "hanako yamada", "age" : 28 }
Und so weiter werden die Dokumente in der Athleten-Sammlung gespeichert.
Die Dokumentenerfassung erfolgt ebenfalls in der Athletenklasse. Lassen Sie uns alle Datensätze mit der Methode all ()
über die Eigenschaft properties
abrufen (die Django-Benutzern bekannt ist).
>>> Athlete.objects.all()
[<Athlete: taro yamada>, <Athlete: hanako yamada>]
Verwenden Sie die Methode filter ()
, um eine Abrufbedingung hinzuzufügen.
>>> Athlete.objects.filter(age=28)
[<Athlete: hanako yamada>]
Wenn Sie nur ein Dokument abrufen möchten, können Sie die Methode get () verwenden.
>>> Athlete.objects.get(age=28)
<Athlete: hanako yamada>
Eine Ausnahme wird ausgelöst, wenn das Dokument bei Ausführung der Methode get () nicht vorhanden ist.
>>> 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.
Sie können auch die Methode count () verwenden, um die Anzahl der Dokumente zu zählen.
>>> Athlete.objects.all().count()
2
Führen Sie zum Aktualisieren des Dokuments die Methode save () der Instanz aus. Wenn kein Dokument vorhanden ist, wird es hinzugefügt und, falls vorhanden, aktualisiert.
>>> athlete = Athlete.objects.get(name=u"taro yamada")
>>> athlete.age = 50
>>> athlete.save()
<Athlete: taro yamada>
>>> athlete.age
50
Setzen Sie die Methode delete ()
für eine Instanz der Athlete-Klasse ab.
>>> hanako = Athlete.objects.get(age=28)
>>> hanako.delete()
>>> Athlete.objects.all()
[<Athlete: taro yamada>]
Hanako wurde entfernt :)
Wenn Sie versehentlich die Methode "delete ()" nach der Methode "all ()" verketten, verschwindet alles (auch wenn Sie "filter ()" verwenden).
>>> Athlete.objects.all().delete()
>>> Athlete.objects.all()
[]
Taro wurde auch entfernt :)
Recommended Posts