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'