Mongodb python驱动教程

安装

使用python驱动mongodb需要下载、安装PyMongo包

  • Windows用户,点击这里下载。
  • 使用pip安装在linux平台使用pip命令安装:

    pip install pymongo

    指定版本:

    pip install pymongo==2.6.3
    升级:

    `pip install --upgrade pymongo

  • 使用easy_install安装easy_install pymongo
    升级:

    easy_install -U pymongo

使用

安装完毕后,就可以在python shell或者python ide中进行试验,如果安装pymongo成功,那么下面的命令应该可以在python shell中运行:

>>> import pymongo

通过MongoClient连接mongo

    #连接locahost上的mongodb,端口是默认端口,27017
    from pymongo import MongoClient
    client = MongoClient

也可以手动指定host和port:

    client = MongoClient("localhost", 27017)
    #或者
    client = MongoClient("mongodb://localhost:27017/")

获取数据库实例

一个mongodb的实例中,可以有很多独立数据库。我们可以通过下面的方式获取一个数据库的实例:

    db = client.mydatabase

如果上面的方法不起作用,试一下下面的方法:

    db = client['mydatabase']

获取数据集

所谓数据集就是存储再mongodb中的一堆文档,这里可以简单的理解成关系数据库中的表(table),下面的方法获取一个数据集:

    collection = db.mycollection
    #或者
    collection = db[mycollection]

需要注意的是,不管是获取数据库、还是数据集实例,mongodb其实没有进行任何操作,只有当真正的文档insert进去的时候,才会真正创建数据库和数据集。

Documents

Mongodb中的数据是以json风格的文档存在的。在PyMongo中,我们使用dictionaries代表documents。下面的一段文档(dictionary),可以看作是一篇博文的简介:

        import datatime
        post = {
        "auther" : "Mike",
        "text" : "My First blog post",
        "tags" : ["mongodb", "python", "pymongo"],
        "date" : datetime.datetime.utcnow()
        }

Document可以包含python语句,如上面的datetime.datetime,执行时,会自动进行转化。

插入Document

使用insert()方法进行插入:

    posts = db.posts
    post_id = posts.insert(post)
    print post_id

当一篇Document被插入到mongodb中,如果document中没有指定"_id",mongodb会自动为该document添加唯一的"_id"。这个"_id"在该数据集中是惟一的。insert()方法返回值就是这个id,更多关于id的信息,点击documentation on _id

插入完成后,我们可以通过下面的语句列出数据库中的数据集:

    db.collection_names()

结果如下:
[u'system.indexs', u'posts']
system.indexs 这个数据集是mongodb自己创建的内部数据集。

使用find_one()方法获取指定的Document

monbodb中find_one()方法,是最基本的查找方法。该方法返回符合条件的一篇document(如果没有符合条件的,返回None)。当数据集中只有一篇符合条件的文档,或者我们只想看第一篇文档的时候,find_one()就有很有用了。

    posts.find_one()

返回结果:

    {u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}

通过ObjectId检索

我们也可以通过_id来进行检索,在这里_id是ObjectId:

    posts.find_one({"_id": post_id})

结果:

    {u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}

再web应用中,比较常见的就是通过url中的id,来查询相应的document。通常传过来的id是string类型的,我们需要将其转化为ObjectId类型。

    from bson.objectid import ObjectId

    # web页面中,将post_id字符串传递过来
    def get(post_id):
            # Convert from string to ObjectId:
            document = client.db.collection.find_one({'_id': ObjectId(post_id)})

关于Unicode字符串

你可能发现我们存到mongodb中的文档,和我们查询出来的文档不太一样(u'Mike'和‘Mike')。

MongoDB以BSON的格式存储数据。BSON格式的字符串是UTF-8编码的,因此PyMongo必须保证它存储的字符串都是utf-8编码的。Regular strings (<type ‘str’>) are validated and stored unaltered. Unicode字符串首先被UTF-8编码。PyMongo在输出时使用u'Mike'代替'Mike',就是PyMongo对每个BSON字符串进行解码,解成python的unicode字符串。更多

批量Insert

如果要插入很多条数据,一条条插入就显得很麻烦了。PyMongo支持批量插入。下面是例子:

    new_posts = [
        {   "author": "Mike",
            "text": "Another post!",
            "tags": ["bulk", "insert"],
            "date": datetime.datetime(2009, 11, 12, 11, 14)},
        {
            "author": "Eliot",
            "title": "MongoDB is fun",
            "text": "and pretty easy too!",
            "date": datetime.datetime(2009, 11, 10, 10, 45)
        }]

    posts.insert(new_posts)

结果会打印出两个_id。

例子总结:

+ 这个insert()方法返回两个ObjectId对象,每个代表一个插入的Document。
+ new_post[1] 没有tags字段,增加了title字段,这样做是OK的。这就是mongodb schema-free的体现。

检索多个Document

如果我们想同时检索多条数据,需要用到find()方法。find()方法返回一个Cursor实例,我们可以这个Cursor来遍历查询到的Documents。如下面的例子:

        for post in posts.find():
            print post

类似结果如下:

    {u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
    {u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}
    {u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('...'), u'author': u'Eliot', u'title': u'MongoDB is fun'}

为find()方法,添加约束条件:

    for post in posts.find({"author": "Mike"}):
        print post

类似结果:

    {u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
    {u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}

Counting

如果我们项查看某个条件下结果的个数,可以使用count()方法,这就省掉了全局检索。

    posts.count()
    post.find({"author" : "Mike"}).count()

范围检索

Mongodb支持多种不同类型的高级查询, 下面这个例子,检索出某个时间点前发表的博文,并且按照作者名字排序:

    d = datetime.datetime(2009, 11, 12, 12)
    for post in posts.find({"date": {"$lt": d}}).sort("author"):
        print post

结果如下:

    {u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('...'), u'author': u'Eliot', u'title': u'MongoDB is fun'}
    {u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}

索引

为了让上面的那个查询变得更快,我们可以在"date"和"author"字段上加上复合索引。

    >>> from pymongo import ASCENDING, DESCENDING
    >>> posts.create_index([("date", DESCENDING), ("author", ASCENDING)])
    u'date_-1_author_1'
    >>> posts.find({"date": {"$lt": d}}).sort("author").explain()["cursor"]
    u'BtreeCursor date_-1_author_1'
    >>> posts.find({"date": {"$lt": d}}).sort("author").explain()["nscanned"]
    2

这种情况,查询语句会使用BtreeCuosor(the index),查询出了两条结果。更多,点击此处

 

版权声明

本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。

© 空空博客,本文链接:https://www.yeetrack.com/?p=901