python操作MongoDB数据库

MongoDB就是多个集合组成的数据库,而每一个集合又是由多个文档组成。

文档:

#类似于
{
    "_id" : ObjectId("5d2944d421b631f231d08056"),
    "username" : "李阳",
    "password" : "123456",
    "age" : 25,
    "gender" : "male",
    "dept" : [ 
        {
            "title" : "生产部"
        }, 
        {
            "title" : "品质部"
        }
    ]
}
#这样的被称为文档

#文档是可嵌套的

#文档中key值唯一、区分大小写、并且不可重复

#文档中的键值对是有序的

集合:

#集合就是一组文档

#文档类似于关系库里的行

#集合类似于关系库里的表

#集合中的文档无需固定的结构(非关系型)

一、环境安装

1、pymongo安装

(automatic) C:UsersAdministrator>pip install pymongo

2、检测是否安装成功

(automatic) C:UsersAdministrator>python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymongo
>>>

二、python操作MongoDB

from pymongo import MongoClient
from datetime import datetime
from bson.objectid import ObjectId


class MongoDatabase:

    def __new__(cls, *args, **kwargs):
        """单例模式"""
        if not hasattr(cls,"instance"):
            cls.instance = super(MongoDatabase,cls).__new__(cls, *args, **kwargs)
        return cls.instance

    def __init__(self):
        """
        连接数据库
        """
        self.client = MongoClient()
        self.db = self.client['test']

    def add_one(self):
        """
        添加一条数据
        :return: 
        """
        post = {
            "author": "aaa",
            "text": "bbb",
            "date": datetime.utcnow()
        }
        return self.db.table1.insert_one(post)  # 向数据库test的table1表中添加数据

    def get_one(self):
        """
        查询一条数据
        :return:
        """
        return self.db.table1.find_one()

    def get_more(self):
        """
        查询多条数据
        :return:
        """
        return self.db.table1.find({'author': 'aaa'})

    def get_one_from_id(self, id):
        """
        通过id查询数据
        :return:
        """
        obj = ObjectId(id)
        return self.db.table1.find_one({"_id": obj})

    def update_one_data(self):
        """
        通过id更新一条数据
        :return: 
        """
        result=self.db.table1.update_one({'text':'bbb'},{'$inc':{'x':10}})#找到text=bbb这条数据并且将其中的x数值加10
        return result

    def update_many_data(self):
        """
        更新多条数据
        :return: 
        """
        result=self.db.table1.update_many({},{'$inc':{'x':10}})#找到所有数据并且将其中的x数值加10
        return result

    def delete_one(self):
        """
        删除一条数据:如果有多条满足条件,只删除第一条
        :return:
        """
        result=self.db.table1.delete_one({'text':'bbb'})
        return result

    def delete_many(self):
        """
        删除多条数据
        :return:
        """
        result=self.db.table1.delete_many({})
        return result

def main():
    mongo_obj = MongoDatabase()
    print(mongo_obj)
    # 新增数据
    # result=mongo_obj.add_one()
    # print(result.inserted_id)#5d286c7bbf18433e81e4f16f
    # 查询数据
    # result=mongo_obj.get_one()
    # print(result) #字典类型,result['id']
    # 查询多条数据
    # result=mongo_obj.get_more()
    #     # for item in result:
    #     #     print(item['text'])
    # 通过id查询数据
    # result = mongo_obj.get_one_from_id('5d286c7bbf18433e81e4f16f')
    # print(result)
    #更新一条数据
    # result=mongo_obj.update_one_data()
    # print(result.matched_count)
    # print(result.modified_count)
    #删除一条数据
    # result=mongo_obj.delete_one()
    # print(result.delete_count)

if __name__ == '__main__':
    main()
单例模式实现python操作mongodb数据库

三、ODM操作

1、安装mongoengine模块

(automatic) C:UsersAdministrator>pip install mongoengine

2、检测是否安装成功

(automatic) C:UsersAdministrator>python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import mongoengine
>>>

3、模型介绍

mongoengine模块相当于mysql数据库中的sqlalchemy模块,对数据库进行一种对象化的操作,比起原生的操作来的更加方便。

(1)数据类型

BinaryField
BooleanField
ComplexDateTimeField
DateTimeField
DecimalField
DictField
DynamicField
EmailField
EmbeddedDocumentField
EmbeddedDocumentListField
FileField
FloatField
GenericEmbeddedDocumentField
GenericReferenceField
GenericLazyReferenceField
GeoPointField
ImageField
IntField
ListField
MapField
ObjectIdField
ReferenceField
LazyReferenceField
SequenceField
SortedListField
StringField
URLField
UUIDField
PointField
LineStringField
PolygonField
MultiPointField
MultiLineStringField
MultiPolygonField

每个字段类型都可以设置参数:

db_field (默认值:无)
    #MongoDB字段名称。

required (默认值:False)
    #如果设置为True且未在文档实例上设置字段,则在ValidationError验证文档时将引发a 。

default (默认值:无)
    #未为此字段设置值时使用的值。

unique (默认值:False)
    #如果为True,则集合中的任何文档都不具有此字段的相同值。

unique_with (默认值:无)
    #字段名称(或字段名称列表)与此字段一起使用时,集合中不会有两个具有相同值的文档。

primary_key (默认值:False)
    #如果为True,请使用此字段作为集合的主键。 DictField 和EmbeddedDocuments都支持作为文档的主键。

choices (默认值:无)
    #应该限制​​该字段的值的可迭代(例如列表,元组或集合)选择。
  #例如:
    SIZE  =  (('S' 'Small' ),
            'M' 'Medium' ),
            'L' 'Large' ),
            'XL' 'Extra Large' ),
            'XXL' '额外超大' ))
    class  Shirt Document ):
        size  =  StringField max_length = 3 choices = SIZE 

**kwargs (可选的) #可以提供其他元数据作为任意其他关键字参数。但是,您无法覆盖现有属性。常见的选择包括help_text和verbose_name,它们通常由表单和窗口小部件库使用。

(2)创建模型

from mongoengine import connect, Document, StringField, IntField, EmbeddedDocument, ListField, EmbeddedDocumentField

connect('userinfo') #连接数据库,默认连接本地

GENDER_CHOICES = (
    ('male', ''),
    ('female', ''),
)


class Dept(EmbeddedDocument):
    """
    部门表
    """
    title = StringField(max_length=32, required=True)


class User(Document):
    """
    用户表
    """
    username = StringField(max_length=32, required=True)
    password = StringField(max_length=64, required=True)
    age = IntField(required=True)
    gender = StringField(choices=GENDER_CHOICES, required=True)
    dept = ListField(EmbeddedDocumentField(Dept))  # 关联部门表

    meta = {
        'collection': 'user'  # 指定保存在什么文档中
    }

上面的User表相当于集合,它是继承Document类,而dept实际是User表中的一个字段,每一个用户实例都相当于一个文档(集合中的一行数据),具体可以看生成的具体数据:

4、操作模型

在创建模型后,就需要对模型中的数据进行CURD,创建一个类来进行操作:

class MongoEngine(object):

    def add_one(self):
        """
        增加一条数据
        :return:
        """
        product_department = Dept(
            title="生产部"
        )
        quality_department = Dept(
            title="品质部"
        )

        user_obj = User(
            username='李阳',
            password='123456',
            age=20,
            gender='male',
            dept=[product_department, quality_department]

        )
        user_obj.save()
        return user_obj

    def get_one(self):
        """查询一条数据"""
        return User.objects.first()

    def get_more(self):
        """查询多条数据"""
        return User.objects.all()

    def get_from_id(self, id):
        """根据id进行查询"""
        return User.objects.filter(pk=id).first()

    def update_one(self):
        """修改单条数据"""
        return User.objects.filter(gender='male').update_one(inc__age=5)

    def update_more(self):
        """修改多条数据"""
        return User.objects.filter(gender='male').update(inc__age=5)

    def delete_one(self):
        """删除一条数据"""
        return User.objects.filter(gender='male').first().delete()

    def delete_from_id(self,id):
        """根据id进行删除"""
        return User.objects.get(pk=id).delete()

    def delete_more(self):
        """删除多条数据"""
        return User.objects.filter(gender='male').delete()

5、完整实例

from mongoengine import connect, Document, StringField, IntField, EmbeddedDocument, ListField, EmbeddedDocumentField

connect('userinfo') #连接数据库,默认连接本地

GENDER_CHOICES = (
    ('male', ''),
    ('female', ''),
)


class Dept(EmbeddedDocument):
    """
    部门表
    """
    title = StringField(max_length=32, required=True)


class User(Document):
    """
    用户表
    """
    username = StringField(max_length=32, required=True)
    password = StringField(max_length=64, required=True)
    age = IntField(required=True)
    gender = StringField(choices=GENDER_CHOICES, required=True)
    dept = ListField(EmbeddedDocumentField(Dept))  # 关联部门表

    meta = {
        'collection': 'user'  # 指定保存在什么文档中
    }


class MongoEngine(object):

    def add_one(self):
        """
        增加一条数据
        :return:
        """
        product_department = Dept(
            title="生产部"
        )
        quality_department = Dept(
            title="品质部"
        )

        user_obj = User(
            username='李阳',
            password='123456',
            age=20,
            gender='male',
            dept=[product_department, quality_department]

        )
        user_obj.save()
        return user_obj

    def get_one(self):
        """查询一条数据"""
        return User.objects.first()

    def get_more(self):
        """查询多条数据"""
        return User.objects.all()

    def get_from_id(self, id):
        """根据id进行查询"""
        return User.objects.filter(pk=id).first()

    def update_one(self):
        """修改单条数据"""
        return User.objects.filter(gender='male').update_one(inc__age=5)

    def update_more(self):
        """修改多条数据"""
        return User.objects.filter(gender='male').update(inc__age=5)

    def delete_one(self):
        """删除一条数据"""
        return User.objects.filter(gender='male').first().delete()

    def delete_from_id(self,id):
        """根据id进行删除"""
        return User.objects.get(pk=id).delete()

    def delete_more(self):
        """删除多条数据"""
        return User.objects.filter(gender='male').delete()


def main():
    mongo_obj = MongoEngine()
    # 添加一条数据
    user_obj=mongo_obj.add_one()
    print(user_obj.id)
    # 查询一条数据
    # user_obj=mongo_obj.get_one()
    # print(user_obj.id,user_obj.username)
    # 查询所有数据
    # queryset = mongo_obj.get_more()
    # for user_obj in queryset:
    #     print(user_obj.id, user_obj.username)
    # 修改数据
    # result = mongo_obj.update_one()
    # print(result)
    # 删除数据
    # result = mongo_obj.delete_one()
    # print(result)

    # obj = mongo_obj.delete_from_id('5d2944a2a1bd1324ebe43d68')
    # print(obj)


if __name__ == '__main__':
    main()
完整实例
 
原文地址:https://www.cnblogs.com/shenjianping/p/11178716.html