Mongodb 补充
1 mongodb 概述
启动mongo

1 数据库操作
没有数据的 集合 和 数据库不会显示
db 查看当前的数据库名称; 所有物理上存在的数据库
db.stats() 查看当前的数据库信息;
show dbs 查看所有的数据库
use day1 直接创建 并切换数据库
db.dropDatabase() 删除库,需要先切换到当前库
exit 退出
ctrl + c
2 集合操作
db.createCollection("stu")
show collections
show tables
db.t1.insert({"name":"aaa"}) # 创建 t1 同时 插入数据
db.stu.drop()
3 数据类型 和 数据操作
mongodb的数据类型
object ID --- 文档ID ---唯一标识
string 必须是有效的utf-8
boolean
integer 整数可以是 32 64的 取决于服务器
double 储存浮点数
arrays 数组 列表
object 文档可以嵌套
null
timestamp
date new Date()
Object ID
不重复 文档的唯一性(可以自己定义 没有定义的mongodb会默认)
默认 12字节的 16进制数
前四个字节是当前的时间戳 时间相关
3个字节 机器ID
2个字节的MONGODB进程ID
3个字节 简单的增量值
数据操作:
插入:(没有 集合会自己创建)
db.stu.insert(document)
db.stu.insert({name:"gl",gender:0})
db.stu.insertMany([{},{},{}]) 插入多条记录
自动生成的id : _id" : ObjectId("5a043500ffedb64e1403b240")
查询:
db.stu.find()
修改:
覆盖式的 修改:
db.stu.update({"name":"a"},{"username":"al"})
用 $set:{} ($unset:{}删除某个属性)只修改某个属性 --
不用的话 会修改整个文档的结构
db.stu.update({匹配条件},{$set:{name:"abc"}}) 只改第一个匹配的
db.stu.update({},{$set:{name:"abc",gender:0}}) {} 匹配全部 只修改第一个
db.stu.update({匹配条件},{$set:{name:"abc"}},{multi:true}) 全部修改
db.stu.update({找不到带的匹配条件},{$set:{name:"abc"}},{upsert:true}) 找不到 插入记录
db.stu.update({匹配条件},{$unset:{"要删除的字段":"任意字符"}}) 清除某一字段
$inc 增加
db.stu.update({},{$inc:{"age":1}},{multi:true}) age自增1
$push 添加
db.stu.update({匹配条件},{$push:{"hobby":"read"}})
db.stu.update({匹配条件},{$push:{"hobby":{$each:[1,2]}}})
$pop 删除两端
db.stu.update({匹配条件},{$pop:{"hbooy":-1})
db.stu.update({匹配条件},{$pop:{"hbooy":1})
$pull:按照条件删除元素,:"$pull" 把符合条件的统统删掉,而$pop只能从两端删
db.stu.update({匹配条件},{$pull:{"hbooy":["read"]})
$addToSet: 避免添加重复:去重 url
db.urls.insert({"_id":1,"urls":[]})
db.urls.update({"_id":1},{"$addToSet":{"urls":'http://www.baidu.com'}})
db.urls.update({"_id":1},{"$addToSet":{"urls":{"$each":[
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.xxxx.com']}}})
保存:按照 _id 字段
如果一个文档存在的话是 覆盖式的修改,
不存在是添加 insert
db.stu.save({name:"emily",gender:2}) 新增
db.stu.save({_id:"23010132",name:"emily",gender:2}) 有的话覆盖
删除:
1、删除多个中的第一个
db.user.deleteOne({ 'age': 8 })
2、删除国家为China的全部
db.user.deleteMany( {'addr.country': 'China'} )
3、删除全部
db.user.deleteMany({})
db.stu.remove({gender:0},{justOne:true}) # 是否只删除一条
db.stu.remove({}) 删除全部
size:
db.createCollection("sub",{capped:true,size:10}) # 超过 size大小 会覆盖 capped
数据查询:
db.sub.find() 查询所有
db.sub.find().pretty() 查询所有 格式化输出
db.sub.findOne() 查询第一个
比较运算符:
< $lt
<= $lte
> $gt
>= $gte
!= $ne
= {"条件":"条件"}
db.sub.find({age:{$gte:18}})
逻辑及运算符:
且 ,
或 $or[数组]
db.sub.find({$or:[{age:{$gte:18}},{gender:0}],name:"alex"})
非 not
db.sub.find({age:{$not:{$gte:18}}})
取余:
db.sub.stu.find({age:{$mod:[2,1]}}) 除2余1 的age
范围运算符:
$in
$nin
db.sub.find({age:{$in:[18,20]}})
支持正则表达式:
使用 正则 表达式
db.stu.find({name:{$regex:"^黄.*?[a,e]$"}})
取 指定的 字段
db.stu.find({"name":{$regex:"^al"}},{"name":1,"age":1,"_id":0}) 只选择查看name age 不要 id
查找数组 {hobby:["tea","music"]}
db.stu.find({"hobby":"tea"}) 包含tea的全部查找
db.stu.find({"hobby.3":"tea"}) 查看第三个 hobby 是 tea的
db.stu.find({"hobby":{$all:["tea","music"]}}) 查看 hobby 既有 tea 又有 music的
db.stu.find({},{"_id":0,"hobby":{"$slice":[0,3]}}) 查找 所有记录的 第一到第三个hobby
支持函数
db.stu.find({$where:function(){return this.age>20}})
this 指的是文档对象
mongodb 用的是 js的编辑器
limit(n) 选择 n 条 显示的个数
skip(m) 跳过m条
db.sub.find().skip(1).limit(2)
投影:只选择某个字段
db.sub.find({},{name:1,gender:0}) # 表示只查看name字段
排序:
db.sub.find().sort({age:-1}) # 1 -1 正序逆序
db.sub.find().sort({age:-1,"_id":1}) # 先按 age 降序 再按 id正序
count:计数
db.sub.count({name:{$gte:18}})
distinct:消除重复
db.sub.distinct("gender",{age:{$lte:20}})
2 python api pymongo
连接方式
# 1 简写
client = pymongo.MongoClient()
# 2 指定端口和地址
client = pymongo.MongoClient('localhost',27017)
# 3 使用URI 协议
client = pymongo.MongoClient('mongodb://localhost:27017/')
注意 mongodb 默认内置 连接池:
在client.close()之后 ,返回连接到连接池
db.collection.find() --- 还会重新获得连接
(1)插入数据
from datetime import datetime
from pymongo import MongoClient
class TestMongo(object):
def __init__(self):
self.client = MongoClient() # 获取连接
self.db = self.client['mongotest'] # 获取db
def add_one(self):
'''新增数据'''
post = {
'title':'newTitle',
'content':'newContent',
'create_time':datetime.now() # 支持 datetime 时间格式
}
return self.db.news.insert_one(post) # 获取db.table -- insert_one () 获取数据id ret.inserted_id
# 插入多条数据 insert_many([{},{},{}]) 获取数据id ret.inserted_ids
# db.table.count() --> 获取数据数量
def main():
obj = TestMongo()
ret = obj.add_one()
print(ret.inserted_id)
if __name__ == '__main__':
main()
(2)查询数据
def get_one(self):
return self.db.news.find_one() # 获得一个字典结果
def get_more(self):
return self.db.news.find({'content':'newContent'}) # 获得有多个值的 迭代器结果
def get_one_from_id(self,object_id):
from bson.objectid import ObjectId # 导入 ObjectId 对象类型
return self.db.news.find_one({'_id':ObjectId(object_id)}) # mongodb中 '_id'对应的是ObjectId对象
ret = obj.get_one_from_id('5ab0d07236dc0d164c6e3bc1')
print(ret)
(3)修改数据
def update(self):
return self.db.news.update_one({'title':'newTitle'},{'$set':{'content':'oldContent'}}) # 修改一条
return self.db.news.update_many({'title':'newTitle'},{'$set':{'content':'newContent'}}) # 修改多条
ret = obj.update()
print(ret.matched_count) # 匹配到的数据 1 8
print(ret.modified_count) #完成修改的数据 1 0
(4)删除数据
def delete(self):
return self.db.news.delete_one({'num':1}) # 删除一条
return self.db.news.delete_many({'num':1}) #删除多条
ret = obj.delete()
print(ret.deleted_count) # 没有的话 删除值为0
3 MongoEngine 与 ODM
(1)MongoEngine 的使用:
安装:
pip install mongoengine
连接:
from mongoengine import connect
# 1 简写
connect('db')
# 2 指定端口和地址
connect('db',host='',port=27017)
# 3 使用 URI
connect(
db='',
username='',
password='',
host='mongodb://localhost/dbname')
(2)ODM:对象文档 映射
常见数据类型:
StringField
ObjectField
IntField
FloatField
DecimalField
BooleanField
DateTimeField
ListField
基本使用:
from mongoengine import connect
from mongoengine import Document,StringField,IntField,FloatField,ListField,EmbeddedDocument,EmbeddedDocumentField
# 连接数据库 --- 并没有指定collection
connect('mongotest')
SEX_CHOICES = (
('male','男'),
('female','女')
)
# 嵌套的文档类型
class Grade(EmbeddedDocument):
name = StringField(required=True)
score = FloatField(required=True)
meta = {
'collection':'grade'
}
# 静态的文档 --- 若改成 DynamicDocument -- 可以动态添加 模型类中没有定义的字段
class Student(Document):
name = StringField(max_length=32,required=True)
age = IntField(required=True)
address = StringField()
sex = StringField(choices=SEX_CHOICES)
# 嵌套的文档Field(之前定义过的)
grade = ListField(EmbeddedDocumentField(Grade))
meta = {
'collection':'students' # 指定collection -- students
‘ordering’:['-create_time'] # 按照时间倒序排列
}
def __str__(self):
return self.name
# 和ORM一样 定义str方法
添加数据
chinese = Grade(
name = '语文',
score=90)
math = Grade(
name='数学',
score=88)
student_obj = Student(
name = 'egon',
age = 18,
address = '沙河',
sex = 'male',
grade=[chinese,math]
)
# 如果文档类型定义为DynamicDocument 可以动态添加 模型中没有定义的字段
# student.phone = 1121321321
student_obj.save()
print(student_obj.pk) -- >> _id # 获取对象的 pk, id

查询数据
单条数据:
student_obj = Student.objects.first()
print(student_obj) # Student object
print(student_obj.name) # alex
多条数据:
student_obj = Student.objects.all()
print(student_obj) # [<Student: alex>, <Student: egon>]
按条件筛选:
student_obj = Student.objects.filter(pk='5ab0f05136dc0d3358bde887').first()
gradeList = student_obj.grade
for grade in gradeList:
print(grade.score) # 90,80
print(Student.objects.filter(age__gt=18)) # 年龄大于18的 -- 和ORM简直一样
修改数据
Student.objects.filter(name='alex').update(age=40) # 修改多条
Student.objects.filter(name='alex').update_one(age=40) # 修改一条
删除数据
Student.objects.filter('_id'='awewdsad21321').first().delete() #删除一条
Student.objects.filter(age__gt=18).delete() # 删除多条
参考文档 http://docs.mongoengine.org/projects/flask-mongoengine/en/latest/
Mongodb 补充的更多相关文章
- MongoDb进阶实践之六 MongoDB查询命令详述(补充)
一.引言 上一篇文章我们已经介绍了MongoDB数据库的查询操作,但是并没有介绍全,随着自己的学习的深入,对查询又有了新的东西,决定补充进来.如果大家想看上一篇有关MongoDB查询的 ...
- mongodb索引--1亿条记录的查询从55.7秒到毫秒级别<补充版>
从头开始,验证mongodb的索引的好处.(window7环境下) 下载mongodb服务器,并解压到d盘,并使用以下命令启动 mongod --dbpath D:\mongodb\data mong ...
- MongoDB基础
1.概念及特点 说明:由于部分语句中$ 符号无法正常显示,使用¥代表 概念 MongoDB是一个基于文档的分布式的开源的NoSQL数据库,文档的结构为BSON形式,每一个文档都有一个唯一的Object ...
- 在MongoDB的MapReduce上踩过的坑
太久没动这里,目前人生处于一个新的开始.这次博客的内容很久前就想更新上来,但是一直没找到合适的时间点(哈哈,其实就是懒),主要内容集中在使用Mongodb时的一些隐蔽的MapReduce问题: 1.R ...
- Python MongoDB使用介绍
MongoDB介绍 MongoDB是一个面向文档的,开源数据库程序,它平台无关.MongoDB像其他一些NoSQL数据库(但不是全部!)使用JSON结构的文档存储数据.这是使得数据非常灵活,不需要的S ...
- MongoDB笔记
mongodb简介 MongoDB 是一个基于分布式文件存储的数据库.存储的是Bson结构的文档(二进制的JSON),内部执行引擎为JS解释器,把文档存储为BSON结构,在查询时,转换为JS对象,可以 ...
- mongoDB index introduction
索引为mongoDB的查询提供了有效的解决方案,如果没有索引,mongodb必须的扫描文档集中所有记录来match查询条件的记录.然而这些扫描是没有必要,而且每一次操作mongod进程会处理大量的数据 ...
- MongoDB安装并随windows开机自启
MongoDB的官方下载站是http://www.mongodb.org/downloads,可以去上面下载最新的程序下来.在下载页面可以看到,对操作系统支持很全面,OS X.Linux.Window ...
- MongoDB做为一项windows服务启动
MongoDB做为一项windows服务启动 Windows版本安装 MongoDB的官方下载站是http://www.mongodb.org/downloads,可以去上面下载最新的对应版本,有32 ...
随机推荐
- Tensorflow 学习笔记(一)TensorFlow入门
一.计算模型----计算图 1.1 计算图的概念:TensorFlow就是通过图的形式绘制出张量节点的计算过程,例如下图执行了一个a+b的操作. 1.2 计算图的使用 TensorFlow程序一般分为 ...
- 转:zero length array问题
单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如 ...
- Mac下 javac java 进行编译和运行含有包路径及引入jar包的类
近两天因为刚入职,属于熟悉环境的阶段,研究了下算法(第四版),当不使用IDE工具直接使用终端进行javac 编译带有包的类,然后使用java 会出现如下错误提示: 使用谷歌搜索了很久,终于找到解决的办 ...
- cdoj1328卿学姐与诡异村庄
地址:http://acm.uestc.edu.cn/#/problem/show/1328 题目: 卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others) ...
- dojo 官方翻译 dojo/Deferred
延迟,异步调用 官网地址:http://dojotoolkit.org/reference-guide/1.9/dojo/Deferred.html require(["dojo/Defer ...
- poj2996
/*排序函数要写对,优先级:K,Q,R,B,N,P 白色的:如果优先级一样,那么按照行数大的优先,如果行数一样,那么列数小的优先 黑色的:如果优先级一样,那么按照行数小的优先,如果行数一样,那么列数小 ...
- jenkins添加GIT repository报错
添加了ssh互信,但一直提示如下错误. Failed to connect to repository : Command "git ls-remote -h git@git.xxx.cn: ...
- Windows Server 2008 R2 FTP无法从外部访问的解决方法
在Windows Server 2008 R2中配置好FTP服务器后,可以在本机访问,但是无法从另一台电脑访问.原因就是在于防火墙没有配置好. 1.首先检查服务器管理器中的入站规则,确保已启用FTP服 ...
- VRChat简易教程4-使用VRC的接口实现物体的移动(VRC的action和trigger接口)
这个教程我们学习如何实现载具的驾驶 一.准备工作 1 最简单的载具驾驶需要至少两个元素,一是需要一个载具,二是需要一个前进的按钮(这里我们只做前进功能),为了直观的能感受到载具的移动,我们还得创造一个 ...
- OpenGL核心技术之Shadow Mapping
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...