浏览数据库
在shell中使用use函数,在命令后加上希望使用的数据库名称即可浏览数据库。 use 数据库名吗,进入到指定的数据库中。例如 use library
。
该命令是如果存在该数据库,将焦点切换到该数据库,如果该数据库不存在,则会隐式的创建该数据库,并且将焦点切换到该数据库,然后我们可以操作该数据库中集合与数据等。焦点数据库中我们就可以使用db关键字代表当前数据库,该方法只能在MongoDB shell中使用。
查看可用的数据库和集合。
MongoDB将保存数据的时候自动创建数据库,并且还区分大小写。在切换到某个数据库之前,最好先查看MongoDB中目前所有可用的数据库,避免出现忘记数据库名称或者拼写不正确的情况。可通过show dbs
或者 show databases
函数实现。要查看当前数据库中的所有集合,可使用show collections
函数。
数据插入
在集合中插入数据:
1.插入文档:
db.[documentName].insert({})
有几种方式可用完成数据的插入:
1)先定义数据,然后使用insert()或者insertOne()插入数据到集合中
var document=(
{Type:"book",
Title:"Definitive Guide to MongoDB 3rd ed.,The",
ISBN:"978-1-4842-1183-0",
Publisher:"Apress",
Author:["Hows, David","Plugger,Eelco","Membrey,Peter","Hawkins,Tim"]})
db.media.insert(document)
2)在使用insert()或者insertOne()时,在参数中输入文档的内容。
db.media.insert({Type:"CD",Artist:"Nirvana",Title:"Nevemind`",
Tracklist:[{Track:"1",Title:"Smells like Teen Spirit", Length:"5:02"},
{Track:"2", Title:"In Bloom",Length:"4:15"}]})
插入文档时,键的名字必须遵守如下规则:
(1)键不能含有”\0”(空字符)。因为这个字符在文档中表示键的结尾
(2)”.”和”$”是保留字段,非常不建议使用,只有在特定的情况下才会使用,比如”.”字符,该字符在mongoDB中表示取其子字段,所以如果你在键中使用了该字段,取的就不是该字段了。比如{”data.page”:1},这时候我们如果取”data.page”的值,就不是”data.page”这个键了,而是”page”字段的值了。
(3)_开头的键也是保留的,不建议使用。
(4) 键区分大小写,”Foo”和”foo”是两个不同的键。
(5)一个文档中键不能重复。
(6)集合的名称(包括数据库名和.)不能超过128个字符。
(7)集合名必须以字母或者下划线开头,system是保留键,不能使用。
(8)空字符串不能用作集合名称。
查询数据
函数find()提供了从同一集合的多个文档中获取数据的最简单方式。在查询数据时,有大量可用的选项、操作符、表达式、过滤器等。
- 查询出所有library数据库中的media集合的数据
db.media.find()
如果希望查询结果格式规范点,可用使用pretty()函数。
指定返回的键
db.[documentName].find ({条件},{键指定})
数据准备persons.json
- 查询出所有数据的指定键(name ,age ,country)
db.persons.find({},{name:1,age:1,country:1,_id:0})
使用点号
在使用复杂文档结构(包含数组或内嵌对象的文档)时,也可以使用其他方法查询这些对象中的信息。
在键名之后使用点【.】,将告诉find函数查询文档中内嵌的信息,处理数组时代码会更简单些。
- 查询出所有library数据库中的media集合的包含特定歌曲"In Bloom"的CD数据
db.media.find({“Tracklist.Title”: "In Bloom"}
使用函数sort、limit和skip
- 通过sort函数可以对查询返回的结果进行排序。
该函数与SQL 中的ORDER BY 语句类似,它将使用键的名称和排序方法作为条件。其中1代表升序,-1代表降序。
如果使用一个不存在的键用于排序,结果的顺序就是未定义的。 - 使用limit函数可用限制返回结果的最大数目。该函数只需要一个参数:希望返回的结果数目。如果使用的参数为0,将返回所有的结果。
- 使用skip()函数忽略掉集合中的前N个文档。
Skip函数和limit函数结合使用,实现分页查询功能。
1).Limit返回指定的数据条数
1.1查询出persons文档中前5条数据
db.persons.find({},{_id:0,name:1}).limit(5)
2).Skip返回指定数据的跨度
2.1查询出persons文档中5~10条的数据
db.persons.find({},{_id:0,name:1}).limit(5).skip(5)
3).Sort返回按照年龄排序的数据[1,-1]
db.persons.find({},{_id:0,name:1,age:1}).sort({age:1})
注意:mongodb的key可以存不同类型的数据排序就也有优先级
最小值
null
数字
字符串
对象/文档
数组
二进制
对象ID
布尔
日期
时间戳 ->正则 ->最大值
4).Limit和Skip完成分页
4.1三条数据位一页进行分页
第一页:db.persons.find({},{_id:0,name:1}).limit(3).skip(0)
第二页:db.persons.find({},{_id:0,name:1}).limit(3).skip(3)
4.2skip有性能问题,没有特殊情况下我们也可以换个思路
对文档进行重新解构设计
每次查询操作的时候前后台传值全要把上次的最后一个文档的日期保存下来
db.persons.find({date:{$gt:日期数值}}).limit(3)
个人建议:应该把软件的中点放到便捷和精确查询上而不是分页的性能上,因为用户最多不会翻查过2页的。
使用固定集合、自然顺序和$natural
1.自然顺序
自然顺序是数据库中集合的原生排序方法。在查询集合的文档时,没有显式指定排序顺序,结果将默认按照前向自然顺序返回,一般与文档的插入顺序一致。
自然集合的自然顺序没有定义,可能取决于文档增长模式,用于查询的索引和所使用的存储引擎。
固定集合的自然顺序保证与文档插入的顺序一致。
与标准的结合不同,固定集合必须使用createCollection函数来显式创建。必须使用参数指定集合的大小(单位为字节)。
2.固定集合(capped collection)是数据库中的一种集合,它的自然顺序保证与文档插入的顺序一致,另一个优点是大小固定,实现数据替换。
与标准的集合不同,固定集合必须使用createCollection函数来显式创建。必须使用参数指定集合的大小(单位为字节)。
3.创建集合
db.createCollection(name, options)
参数说明:
name: 要创建的集合名称
options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数:
db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )
4 '美元符号’natural
用于逆转默认结果的顺序(即插入文档顺序)
例如:查询用于保存登录失败记录的固定集合audit中最近的10条记录
db.audit.find().sort({$natural: -1}).limit(10)
固定集合中的文档可以更新,但是文档大小不能改变,文档也不是删除,前者出现将提示更新失败,后者要实现必须删除整个集合并重建。
使用validate()检查现有集合已经使用的空间和stats()检查集合大小
获取单个文档
可以用findOne()函数来获取集合中的单个文档。与limit(1)函数得到的结果是一致,表示获取集合中的第一个文档。
findOne()函数与find()函数的语法结构一致。
使用聚集命令
使用聚集命令中的3个函数:count,distinct,group,还包括聚集框架.
- 使用count()函数返回文档的数目
使用count()函数将返回指定集合中文档的数目
db.media.count()
还可以结合条件操作符使用count(),执行额外的过滤
db.persons.find({country:”China”}),count()
- 使用distinct()函数获取唯一值 —相当于SQL中的distinct
查询persons集合中国家的信息
db.persons.distinct(“country”)
还可以接受嵌套键作为distinct()的参数
查询CD标题的唯一值
db.media.distinct(“Tracklist.Title”)
- 使用group函数将结果分组----相当于SQL中的group by 字句
使用group()
函数将返回一个已分组元素的数组。函数group()接受3个参数:key、initial和reduce
。
Key :分组键对象,指定希望使用哪个键对结果进行分组
Initial:初始化累加器,指定为每个分组结果提供的元素统计的起始基数。如果希望返回指定的数字,整个参数就默认为0.
Reduce:组分解器。把所有类似的条目分组在一起。接受两个参数items和prev,表示正在遍历的当前文档和聚集计数对象。
find查找详解
-
MongoDB 支持大量的条件操作符用于更好地过滤结果。常用的条件操作符查询条件如下:
-
查询条件
2.1查询出年龄在25到27岁之间的学生
db.persons.find({age: {$gte:25,$lte:27},{_id:0,age:1})
2.2查询出所有不是韩国籍的学生的数学成绩
db.persons.find({country:{$ne:” Korea”}},{_id:0,m:1})
-
包含或不包含
i n 或 in或 in或nin
2.3查询国籍是中国或美国的学生信息
db.persons.find({country:{$in:[“USA”,“China”]}})
2.4查询国籍不是中国或美国的学生信息
db.persons.find({country:{$nin:[“USA”,“China”]}})
-
OR查询
$or
2.4查询语文成绩大于85或者英语大于90的学生信息
`db.persons.find({$or:[{c:{$gte:85}},{e:{$gte:90}}]},{_id:0,c:1,e:1})`
-
Null
把中国国籍的学生上增加新的键sex
db.person.update({country:”China”},{$set:{sex:”m”}})
2.5查询出sex 等于 null的学生
db.persons.find({sex:{$in:[null]}},{country:1})
-
正则查询
2.6查询出名字中存在”li”的学生的信息
db.persons.find({name:/li/i},{_id:0,name:1})
-
n o t 的 使 用 ‘ not的使用 ` not的使用‘not
可以用到任何地方进行取反操作 2.7查询出名字中不存在”li”的学生的信息
db.persons.find({name:{$not:/li/i}},{_id:0,name:1})`
n o t 和 not和 not和nin的区别是 n o t 可 以 用 在 任 何 地 方 儿 not可以用在任何地方儿 not可以用在任何地方儿nin是用到集合上的 -
数组查询
$all
和index应用
2.8查询喜欢看MONGOD和JS的学生
db.persons.find({books:{$all:[“MONGOBD”,”JS”]}},{books:1,_id:0})
2.9查询第二本书是JAVA的学习信息
db.persons.find({“books.1”:”JAVA”})
-
查询指定长度数组
$size
它不能与比较查询符一起使用(这是弊端)
2.8查询出喜欢的书籍数量是4本的学生
db.persons.find({books:{$size:4}},{_id:0,books:1})
2.9查询出喜欢的书籍数量大于3本的学生
1.增加字段size`db.persons.update({},{$set:{size:4}},false, true)` 2.改变书籍的更新方式,每次增加书籍的时候size增加1 `db.persons.update({查询器},{$push:{books:”ORACLE”},$inc:{size:1}})` 3.利用`$gt`查询 `db.persons.find({size:{$gt:3}})`1 2.10利用shell查询出Jim喜欢看的书的数量
var persons = db.persons.find({name:"jim"})
while(persons.hasNext()){
obj = persons.next();
print(obj.books.length)
}
-
KaTeX parse error: Expected '}', got 'EOF' at end of input: …jim"},{books:{"slice":[1,3]}})
2.12查询出最后一本书
db.persons.find({name:“jim”},{books:{"$slice":-1},_id:0,name:1})` -
文档查询
为jim添加学习简历文档 jim.json
2.13查询出在K上过学的学生- 这个我们用绝对匹配可以完成,但是有些问题(找找问题?顺序?总要带着score?)
db.persons.find({school:{school:"K",score:"A"}},{_id:0,school:1})
2.为了解决顺序的问题我可以用对象”.”的方式定位
db.persons.find({"school.score":"A","school.school":"K"},{_id:0,school:1})
3.这样也问题看例子:
db.persons.find({"school.score":"A","school.school":”J”},{_id:0,school:1})
同样能查出刚才那条数据,原因是score和school会去其他对象对比
4.正确做法单条条件组查询$elemMatch
- 这个我们用绝对匹配可以完成,但是有些问题(找找问题?顺序?总要带着score?)
db.persons.find({school:{$elemMatch:{school:"K",score:"A"}}})
1