文档
mongodb中数据的组织形式 ---》文档
mongodb 文档 : 是以键值对的形成组成的一组数据。类似python中字典描述数据的方式
键 : 即文档的域,表达了一个键值对的含义
键的命名规则:
1. utf-8格式字符串
2. 不能使用‘\0’
3. 一个文档中的键不能重复
值 : 即文档存储的数据。
* 文档中键值对是有序的
* 文档中键值对严格区分大小写
类型 值
整型 整数 1 2 3
布尔类型 true false
浮点型 小数
Array 数组
Date 时间日期
Timestamp 时间戳
String 字符串
Symbol 特殊字符串
Binary data 二进制子串
Null null 空值
Object 内部文档(对象)
code js代码
regex 正则子串
ObjectId 自动生成ID标记
"_id" : ObjectId("5ba07671b17d2b40342f7c5c")
_id : 当mongodb插入文档时如果不指定_id域则自动生成_id域。值如果不自己指定即会自动生成一个ObjectId值
24位16进制 使用ObjectId经过算法处理保证其唯一性
5ba07671b17d2b40342f7c5c
8位文档创建时间 6位 机器ID 4位进程id 6位计数器
集合中的文档
1. 集合中的文档不一定有相同的域
* 个数不同
* 域不相同
* 数据类型不同
2. 集合中文档各自比较独立,相互并不影响
集合创建原则
1.集合中的文档要描述同一类事物
2.数据库中同一类数据尽量集中存放在相同的集合
3.集合中的文档嵌套层数不要太多
插入文档
db.collection.insert()
功能 : 插入一个文档
参数 : 要插入的文档
插入单个文档
e.g.
db.class0.insert({'name':'Lucy',"age":18,"sex":'w'})
db.class0.insert({_id:1,name:'Jame',age:16,sex:'m'})
* 插入操作中键可以不加引号
* 查看插入结果 db.class0.find()
* _id 值可以自己插入,但是不能重复
插入多条文档
插入多条文档时,参数用中括号里面放入多个文档
e.g.
db.class0.insert([{name:"Alex",age:19,sex:'m'},{name:'Abby',age:18,sex:'w'}])
其他插入方法
insertOne() 插入一条文档
db.class0.insertOne({name:"Levi",age:20,sex:'m'})
insertMany() 插入多条文档
db.class0.insertMany([{name:"John",age:16,sex:'m'},{name:"Lenzer",age:17,sex:'m'}])
save插入文档
db.collection.save()
如果正常插入与insert用法相同
e.g.
db.class0.save({name:'Allen',age:19,sex:'m'})
db.class0.save([{name:"Sunny",age:17,sex:'w'},{name:'Alice',age:16,sex:'w'}])
如果插入数据是有_id域,且_id域值存在时则会修改原有文档,如果该值不存在则正常插入
db.class0.save({_id:2,name:'Mary',age:20,sex:'w'})
获取集合对象方法
db.class0 ===> db.getCollection('class0')
e.g.
db.getCollection("class0").find()
查找操作
mysql : select * from table where ...
mongodb : db.collection.find(query,field)
查找所有内容
db.collection.find() ----> select * from table
find(query,field)
功能 : 查找文档
参数 : query 查找条件,相当于where子句
field 查找的域
返回值 : 查找到的所有文档
query : 以键值对方式传递参数,如果是空{}表示查找所 有内容
e.g. 查找所有性别为w的文档
db.class0.find({sex:'w'})
field : 以键值对的方式给出要查找(不查找)的域
以域名为键,以0,1为值分别表示不查找和查找
* 如果某一个或多个域设置为0 表示这些域不查找,其他域均查找
* 如果某一个或多个域设置为1 表示这些域查找,其他域均不查找
* _id 除非设置为0 否则均会查找
* 除_id域其他域不能有的设置1有的设置0
e.g. 查找结果只有name域
db.class0.find({sex:'w'},{_id:0,name:1})
findOne(query,field)
功能 : 查找第一条符合条件的文档
参数 : 同find
返回值: 返回查找到的文档
e.g. 查找集合中性别为女的第一个文档
db.class0.findOne({sex:'w'},{_id:0,name:1})
query更多的筛选用法
操作符 : 使用$符号注明的一个特殊字符串,表达一定的 含义,比如 $lt 表示小于
比较操作符
$eq 等于 ==
e.g. 查找年龄等于18
db.class0.find({age:{$eq:18}},{_id:0})
==》db.class0.find({age:18},{_id:0})
$lt 小于 <
e.g. 查找年龄小于18的
db.class0.find({age:{$lt:18}},{_id:0})
db.class0.find({name:{$lt:"John"}},{_id:0})
* 在mongodb中字符串可以比较大小
$lte 小于等于 <=
e.g. 年龄小于等于18
db.class0.find({age:{$lte:18}},{_id:0})
$gt 大于 >
e.g. 查找年龄大于16 且 小于19
db.class0.find({age:{$gt:16,$lt:19}},{_id:0})
* 在mongodb中所有的{} [] 中都可以写多个条件。但根据 参数的不同表达的意思不一样
$gte 大于等于 >=
e.g. 大于等于19
db.class0.find({age:{$gte:19}},{_id:0})
$ne 不等于 !=
e.g. 性别不等于‘m’的
db.class0.find({sex:{$ne:'m'}},{_id:0})
* 使用ne查找也会找到该域不存在的文档
$in 包含
e.g. 找到年龄为 [10,20,30]
db.class0.find({age:{$in:[10,20,30]}},{_id:0})
$nin 不包含
e.g. 找到年龄不是 17 18 19 的
db.class0.find({age:{$nin:[17,18,19]}},{_id:0})
逻辑操作符
$and
1. 在 query 如果写多个条件默认即为 and 关系
e.g.
db.class0.find({age:{$lt:18},sex:'m'},{_id:0})
2. 逻辑与 $and
e.g. 年龄小于18并且 性别为男
db.class0.find({$and:[{age:{$lt:18}},{sex:'m'}]},{_id:0})
$or 逻辑或
e.g. 年龄小于16或者年龄大于18
db.class0.find({$or:[{age:{$lte:16}},{age:{$gt:18}}]},{_id:0})
$not 逻辑非
e.g. 查找年龄不小于18岁的
db.class0.find({age:{$not:{$lt:18}}},{_id:0})
$nor not (a or b) ===> (not a) and (not b)
e.g. 性别不是m且年龄不小于18
db.class0.find({$nor:[{sex:'m'},{age:{$lt:18}}]},{_id:0})
逻辑条件混合
(年龄大于17 并且 为男生) 或者 姓名叫 Abby
db.class0.find({$or:[{age:{$gt:17},sex:'m'},{name:'Abby'}]},{_id:0})
(年龄不大于18 或者为 女性) 并且 姓名 大于Lucy
e.g.
db.class0.find({$or:[{age:{$not:{$gt:18}}},{sex:'w'}],name:{$gt:'Lucy'}},{_id:0})
Array
[1,2,3,4]
* 数组是有序的数据集合
* mongo中数组也可以有多重数据元素混合
查找数组中包含某一条件的元素
e.g. 只要score数组中包含小于60的元素即可查询过滤
db.class1.find({score:{$lt:60}},{_id:0})
$all
查找数组同时包含多项的文档
e.g. 查找同时包含49 67的文档
db.class1.find({score:{$all:[49,67]}},{_id:0})
$size
通过数组元素个数查找
e.g. 查找score中包含两个元素的文档
db.class1.find({score:{$size:2}},{_id:0})
$slice
显示数组中指定项
e.g. 显示数组前两项
db.class1.find({},{_id:0,score:{$slice:2}})
e.g. 跳过第一个显示后面两个
db.class1.find({},{_id:0,score:{$slice:[1,2]}})
其他常用查找操作符
$exists
通过某个域是否存在筛选(true表示存在false表示不存在)
e.g. : 查找不存在sex域的文档
db.class1.find({sex:{$exists:false}},{_id:0})
$mod
余数查找
e.g. 找出年龄为单数的文档
db.class1.find({age:{$mod:[2,1]}},{_id:0})
$type
找出指定数据类型的文档
e.g. 查找name域值类型为2的文档
db.class1.find({name:{$type:2}},{_id:0})
查找结果的操作函数
db.collection.distinct(filed)
功能: 查看某个域的值范围
e.g. 获取某个域的值,去重
db.class0.distinct('age')
pretty()
功能:格式化显示查询结果
e.g.
db.class0.find().pretty()
limit(n)
功能:显示前n条结果
e.g. 显示查询结果前三条
db.class0.find({},{_id:0}).limit(3)
skip(n)
功能: 跳过前n条显示后面的查询结构
e.g. : 跳过前5条文档,显示后面的查询结果
db.class0.find({},{_id:0}).skip(5)
count()
功能 : 统计查询结果数量
* 在统计数量时要给出一定query条件
e.g. 统计性别为w的文档个数
db.class0.find({sex:'w'},{_id:0}).count()
sort({field: 1/-1})
功能: 对查找结果排序
参数: 以键值对表示按照哪个field排序
1 表示升序,-1表示降序
e.g. 查找结果按照降序排序
db.class0.find({},{_id:0}).sort({age:-1})
复合排序
e.g. 按照年龄升序排序,年龄相同时按照姓名降序
db.class0.find({},{_id:0}).sort({age:1,name:-1})
函数的连续调用
e.g.
db.class0.find({},{_id:0}).sort({age:1}).limit(3)
想要看更多的课程请微信关注SkrEric的编程课堂