Python系列之MongoDB--01.基本知识

mongodb的下载与安装(请下载3.0.15版本的避免不必要的错误)

  • 安装步骤
1.安装比较简单,中间主要是选择“Custom”自定义 安装路径修改下:D:\MongoDB,直接放在D盘根目录下然后不断“下一步”,安装至结束。

2.在MongoDB下创建data,在data下再创建db:D:\MongoDB\server\data

3.打开CMD,进入D:\MongoDB\server\3.0\bin,输入如下的命令启动mongodb服务:mongod --dbpath D:\MongoDB\server\data,
![如图](https://cl.ly/0x3M3y313y29/QQ%E6%88%AA%E5%9B%BE20180417094958.png)
4.打开新的CMD,进入D:\MongoDB\server\3.0\bin,输入mongo命令
  进行连接

mongodb的基本操作指令

创建数据库

use DATABASE_NAME # 如果不存在则会自动创建,否则使用该数据库

查看所有数据库

>show dbs
>local  0.078GB  
test   0.078GB

向数据库中插入一条数据

db.DATABASE_NAME.insert({"name":"mongodb"})

插入文档

db.COLLECTION_NAME.insert(document)
实例
db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'MongoDB中文网', 
url: 'http://www.mongodb.org.cn', 
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100 # 这是级别

也可以将数据定义一个量再插入
document=({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'MongoDB中文网', 
url: 'http://www.mongodb.org.cn', 
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100})

db.COLLECTION_NAME.insert(document)

查询语句

db.COLLECTION_NAME.find().pretty() # 将数据进行格式化查出

修改语句

db.collection.update(    
<query>,  # 条件 类似sql的where后面的语句
<update>, # 类似于 sql的set后面的值
{       
    upsert: <boolean>,   # 可选参数,如果不存在是否插入该数据,默认false不插入,true插入
    multi: <boolean>,  # 可选参数true 只跟新查到的第一条记录
    writeConcern: <document>  # 可选 抛出异常的级别
}
)

db.COLLECTION_NAME.update(
{'title':'MongoDB 教程'},
{$set:{'title':'MongoDB'}},
{multi:true}
)

save()方法,与insert()的区别。前者是如果存在ID相同的数据就将其覆盖,后者将会报错

db.collection.save(    
<document>,     # 保存的文档
{      
    writeConcern: <document> # 抛出异常的级别
}  
)  
实例

db.COLLECTION_NAME.save({   
"_id" : ObjectId("56064f89ade2f21f36b03136"),   
"title" : "MongoDB",  
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "MongoDB中文网",   
"url" : "http://www.mongodb.org.cn",     
"tags" : [           
    "mongodb",       
    "NoSQL"    
],    
"likes" : 110
}
)

删除语法

db.collection.remove( 
<query>,     # 条件
<justOne>   # 是否删除一个
)  

实例
db.COLLECTION_NAME.remove({'title':'MongoDB 教程'})  WriteResult({ "nRemoved" : 2 })

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

如图

and条件

db.COLLECTION_NAME.find({key1:value1, key2:value2}).pretty()  

类似于where语句WHERE key1='value1' AND key2='value2'

or条件

db.COLLECTION_NAME.find{  $or: [        {key1: value1}, {key2:value2}        ]     }  ).pretty()

db.COLLECTION_NAME.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()

可视化试图工具robomongo的安装
https://robomongo.org/download

python连接数据库

pymongo的使用

pip install pymongo #在python命令界面安装
from pymongo import MongoClient  #导入模块
client=MongoClient('localhost',20171) #获取连接

# 增加一条数据value保存的值,table指定的表
def save(self, value, table):  
    self.db[table].insert_one(value)
    return True

# 修改一条数据condition条件,table指定的表,data修改数据
def update(self, table, condition, data):
    self.db[table].update(condition, data, False, False)
    return True

# 查询指定列的数据value保存的值,table指定的表Column列名
def selectColumn(self, table, value, column):
    post = self.db[table].find(value, {column: 1})
    return post

# 通过Id删除数据pk为ID,table指定的表
def delete(self,pk,table):
    self.db[table].delete_one(pk=pk)
    return True

mongoengine的使用

pip install mongoengine
from mongoengine import * 
connect('数据库名') # 连接数据库

# 成绩集合
class Grade(EmbeddedDocument):
    score = FloatField(required=True)
    name = StringField(required=True)


SEX_CHOICES = {
('female', '女'),
('male', '男')
}

# 编写ord模型,grades引用Grade能够封装数据
class Student(Document):
    name = StringField(required=True, max_length=20)
    sex = StringField(required=True,choices=SEX_CHOICES)
    age = IntField(required=True)
    create_time = DateTimeField()
    grades = ListField(EmbeddedDocumentField(Grade))

    meta = {
    'collection':'student'  # 指定集合名,如果这里没指明会根据模型名来创建
    }

    def add_one(self):
    chinese = Grade(
        name='语文',
        score=88.2
    )
    math = Grade(
        name='数学',
        score=78
    )
    English = Grade(
        name='英语',
        score=78
    )
    cls = Classmate(
        name="是谁",
        age=21,
        sex='female',
        grades=[chinese, math,English]
    ).save()
    return cls


#  这是进行逻辑处理的类
class Controller(object):
    '''查询一条数据'''
    def find_one(self):
        cls = Classmate.objects.first()
        return cls
    '''查询多条数据'''
    def find_all(self):
        return Classmate.objects.all()
    '''根据id来获取数据'''
    def get_by_id(self,id):
        return Classmate.objects.filter(pk=id).first()
    '''修改性别为male的年龄增加10'''
    def update(self):
        Classmate.objects.filter(sex='male').update(inc__age=10)
        return True
    '''删除数据性别为male的'''
    def delete(self):
        Classmate.objects.filter(sex='male').delete()
        return True

应用flask框架搭建简易的新闻项目,前端页面都有

新建一个flask项目

1.在news.py中

from datetime import datetime
from flask import Flask, render_template, flash, redirect, url_for, abort, request
from flask_mongoengine import MongoEngine
from forms import NewsForm

app = Flask(__name__)
# mongodb 数据库配置
    app.config['MONGODB_SETTINGS'] = {
    'db': 'flask-news',
    'host': '127.0.0.1',
    'port': 27017
}
# 获取DB
db = MongoEngine(app)



class News(db.Document):
""" 新闻模型 """

    title = db.StringField(required=True, max_length=200)
    img_url = db.StringField()
    content = db.StringField()
    is_valid = db.BooleanField(default=True)
    created_at = db.DateTimeField(default=datetime.now())
    updated_at = db.DateTimeField(default=datetime.now())
    news_type = db.StringField(required=True, choices=NEWS_TYPES)

    meta = {
        'collection': 'news'  # 指定表是news
        'ordering':'-created_at' # 指定排序按照时间的倒序
    }


    @app.route('/')  #设置路由通过http访问
    def index():
    """ 新闻首页 """
        news_list = News.objects.filter(is_valid=True)# 查询所有数据
        # 跳转到index.html中,index.html有一个属性news_list并赋值,就能查询到
        return render_template("index.html", news_list=news_list)


    @app.route('/cat/<name>/')# 前端新闻类别有个属性name,取得值传入方法通过新闻类型查询并把值传回前端
    def cat(name):
        """ 新闻类别页面 """
        news_list = News.objects.filter(is_valid=True, news_type=name)# 查询符合类型的且未被删除的
        return render_template('cat.html', name=name, news_list=news_list)

    # 通过主键查询详情将信息传到前台
    @app.route('/detail/<pk>/')
    def detail(pk):
    """ 新闻详情页 """
    new_obj = News.objects.filter(pk=pk).first()
    return render_template('detail.html', new_obj=new_obj)

    # 从前台传page属性通过自带的paginate方法进行分页,并将查询的值传到前台
    @app.route('/admin/')
    @app.route('/admin/<int:page>/')
    def admin(page=None):
    """ 后台管理首页 """
    if page is None:
        page = 1
    page_data = News.objects.filter(is_valid=True).paginate(page=page, per_page=4)
    return render_template("admin/index.html", page_data=page_data)


    # 添加路由,因为需要返回到admin主页面所以需要支持post方法
    @app.route('/admin/add/', methods=['GET', 'POST'])
    def add():
        """ 新增新闻 """
        form = NewsForm() # 实例化表单
        if form.validate_on_submit():# 如果提交表单
            n1 = News(
                title=form.title.data,# 获取表单栏目中的数据分别赋值
                content=form.content.data,
                img_url=form.img_url.data,
                news_type=form.news_type.data
    )
            n1.save()# 进行保存
            flash("新增成功")# 弹出对话框
            return redirect(url_for('admin'))# 跳转到admin路由
        return render_template("admin/add.html", form=form)

    # 从前台传入需要修改的主键
    @app.route('/admin/update/<pk>/', methods=['GET', 'POST'])
    def update(pk):
        """ 新增新闻 """
        obj = News.objects.filter(pk=pk).first()# 通过主键获取对象
        if obj is None:
            abort(404)   # if 对象是空,推出到404
        form = NewsForm(obj=obj)# 将对象返回到页面
        if form.validate_on_submit():# 提交表单将表单的值赋值给查出来的对象
            obj.title = form.title.data
            obj.content = form.content.data
            obj.news_type = form.news_type.data

            obj.save()# 保存
            flash("修改成功")
            return redirect(url_for('admin'))# 跳转到admin路由
        return render_template("admin/update.html", form=form)

# 通过前台传入pk值,查出数据
@app.route('/admin/delete/<pk>/', methods=['POST'])
def delete(pk):
    """ 新增新闻 """
    if request.method == 'POST':
        obj = News.objects.filter(pk=pk).first()
        if obj is None:
            return 'no'# 通过前端的Ajax获取传入的值,判断是否为yes,是yes的话,将所选对象隐藏,否则弹出删除失败
        obj.is_valid = False
        obj.save()
        return 'yes'
    return 'no'

猜你喜欢

转载自blog.csdn.net/prospective0821/article/details/80109469