Skr-Eric的MongoDB课堂(三)——MongoDB的文档的插入和查找

文档

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的编程课堂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值