除了可以在菜鸟教程学习,最好的资料就是mongoDB文档了,这里的文档最全面,菜鸟教程中的语法只是部分...
MongoDB 3.4 中文文档
一、基础知识
1.文档(document):相当于传统关系型数据库的“行”,但比传统行表示的信息更加复杂。例如:
1
|
{
"name"
:
"jack"
,
"age"
:18,
"sex"
:
"male"
}
|
2.集合(collection):这个在MongoDB中代表一组文档,类似于关系型数据库中的表。但在MongoDB中的表(就是集合)是没有模式的,你可以将完全不同的文档放入同一个集合中.但在实际使用中,为特定集合隐性规定一种模式。注:当集合里没有任何文档时集合其实也是不存在的。当第一个文档插入时,集合就会被创建。
3.数据库(database):在MongoDB中,一组集合可以组成一个数据库。一个MongoDB实例可以承载多个数据库。每个数据库都有独立的权限控制。在实际应用中,通常,一个应用的所有数据放置在一个数据库中。
1.null:用于表示空值或不存在的字段。Shell中这样表示:
{"x":null}
2.布尔:有两个值,true和false。Shell中这样使用:
{"x":true}
3.数字:Shell中数字均为64位浮点数,如在Shell中
{"x":3.14}
和{"x":3}
这两个文档中的值均是64位的浮点数。4.字符串:这个用的最广,Shell中这样表示:
{"x":"hello world!"}
5.日期:这个在数据存储时,存储的是从标准纪元开始的毫秒数,没有存储时区信息。
6.正则表达式:文档中可以包含正则表达式,采用JavaScript的正则表达式语法即可,Shell中这样表示:
{"x":/foobar/i}
。7.数组:数组是一组值,既可以表示为有序对象(列表,栈,队列等)也可以表示无序对象(集合),Shell中这样表示一个数组:
{"things":["pie",3.14]}
。8.内嵌文档:把一个文档整个作为另一个文档某一个键对应的值。
其他包括二进制数据,代码等。
二、基础操作与CRUD
1、MongoDB入门(Shell基本操作)
运行mongo启动shell:
![]()
shell是一个功能完备的JavaScript解释器,可运行任意的JavaScript程序。这里不做示例。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
1.选择数据库
12#选择名test数据库
use tset
![]()
如果忘记了数据库名称可以输入如下代码查询所有数据库名称:"show dbs" 命令可以显示所有数据的列表
1show dbs
![]()
查看数据库中的集合名:
1show collections
结果如图所示:
![]()
下表列出了 RDBMS 与 MongoDB 对应的术语:
2、插入文档
insert函数可将一个文档插入到集合中去。以一个博客举例。先创建一个叫post的变量(JavaScript对象)有三个键和对应的属性。插入代码:
1db.blog.insert(post)
如图所示:
![]()
批量插入
1db.blog.insertMany([{
"_id"
:0},{
"_id"
:1},{
"_id"
:2}])
3、查询文档
查询代码如下:
1db.blog.
find
()
如图所示:
![]()
多出来的"_id"就是MongoDB自动创建的默认为ObjectID类型的对象。在一个集合里,每个文档都由唯一的"_id",确保集合中的每个文档都能被唯一标识,它采用12字节的存储空间,由24个16进制数字组成,可分为四部分组成:
{0,1,2,3} {4,5,6} {7,8} {9,10,11} 时间戳 机器码 PID(线程码) 自增计数器 如果插入文档时没有"_id"键,系统会为我们自动创建一个。
若只想查看一个文档,可以用findOne:
1db.blog.findOne()
查询具体的某一个文档那么就要以json的形式添加查询条件,例如:
1db.blog.
find
({
"title"
:
"My Blog Post"
})
以上实例中类似于 WHERE 语句:WHERE title = 'My Blog Post';
4、修改文档
如果给博客新增一个评论功能,则需要新增key-value,用于保存评论数组。
1post.comments = []
之后用新版本的文档替换旧版本:
1db.blog.update({
"title"
:
"My Blog Post"
},post)
使用修改器:
"$Set":用来指定一个字段的值,若字段不存在,则创建它。
123db.
users
.update({
"sex"
:
"male"
},{
"$Set"
:{
"gift"
:
"happy birthday!"
}})
/*这样只会更新一个文档,若要更新多个文档,则需要将update的第四个参数设置为
true
*/
db.
users
.update({
"sex"
:
"male"
},{
"$Set"
:{
"gift"
:
"happy birthday!"
}},
false
,
true
)
"$inc":用来增加已有键的值,若键不存在,就创建它。(与"$Set"类似,专门用来增加数字的,只能用于整形,长整型,双精度浮点型)
1db.games.update({
"game"
:
"pinball"
,
"user"
:
"joe"
},{
"$inc"
:{
"score"
:50}})
"$push":会向已有的数组末尾加入一个元素,若数组不存在,则创建数组。与"$each"自操作符一同使用可以一次添加多个值。
1db.stock.ticker.update({
"_id"
:
"1"
},{
"$push"
:{
"hourly"
:{
"$each"
:[562.667,562.790,562.123]}}})
"$addToSet":可以避免重复插入。若数组内已有相同数据,则不差入。与"$each"自操作符一同使用可以一次添加多个值。
1db.
users
.update({
"_id"
"1},{"
$addToSet
":{"
emails
":"
joe@gmail.com"}})
"$push":删除数组里的元素.("$pop":将数组看成队列或栈,从两端删除。"$pull":将所匹配到的数组中的值删除,而不是只删除一个)
5、删除文档
1db.blog.remove({
"title"
:
"My Blog Post"
})
![]()
删除整个集合用drop()
1db.blog.drop()
索引
MongoDB使用 ensureIndex() 方法来创建索引。
db.COLLECTION_NAME.ensureIndex({KEY:1})语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
当然也可以给多个字段建立索引
1db.col.ensureIndex({
"title"
:1,
"description"
:-1})
6、管道聚合
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
123456db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
- $match:用于过滤数据,只输出符合条件的文档。
1234db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $
sum
: 1 } } }
] );
- $limit:用来限制MongoDB聚合管道返回的文档数。
1db.article.
find
().limit
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
1db.article.aggregate( { $skip : 5 });
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。