MongoDB基础入门

什么是MongoDB

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源非关系型(Nosql)数据库系统。
是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB概念解析

在mongodb中基本概念是文档,集合,数据库

mysqlMongoDB
数据库(database)数据库(database)
表(table)集合(collection)
数据字段(column)域(field)
索引(index)索引(index)
主键(primary key)自动将ID视为主键
一条记录文档

在这里插入图片描述

数据库

一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
“show dbs” 命令可以显示所有数据的列表。
数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。

不能是空字符串("")。
不得含有’ '(空格)、.、$、/、\和\0 (空字符)。
应全部小写。
最多64字节。

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。

admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

集合

集合就是 MongoDB 文档组,类似于mysql数据的中的表。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。当第一个文档插入时,集合就会被创建。
合法的集合名

集合名不能是空字符串""。
集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

上限集合(capped collections)

集合可以设置集合的固定大小创建一个上限集合(capped collections)。
它有很高的性能以及队列过期的特性(过期按照插入的顺序).。
上限集合是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能和标准的 集合不同,你必须要显式的创建一个上限集合,指定一个 集合的大小,单位是字节。集合的数据存储空间值提前分配的。
db.createCollection(“mycoll”, {capped:true, size:100000})
//java设置集合的大小
CreateCollectionOptions options = new CreateCollectionOptions().sizeInBytes(100L);
database.createCollection(“test111”,options);//创建集合
上限集合可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以当我们更新上限集合中文档的时候,更新后的文档不可以超过之前文档的大小,这样话就可以确保所有文档在磁盘上的位置一直保持不变。
由于上限集合是按照文档的插入顺序而不是使用索引确定插入位置,这样的话可以提高增添数据的效率。MongoDB 的操作日志文件 oplog.rs 就是利用上限几个来实现的。
要注意的是指定的存储大小包含了数据库的头信息 .

  1. 在 上限集合 中,你能添加新的对象。
  2. 能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。
  3. 使用上限集合里面不能删除一个文档,可以使用 drop() 方法删除 collection 所有的文档。
    删除之后,你必须显式的重新创建这个 collection。
文档

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
一个简单的文档例子如下:

{“site”:“www.baidu.com”, “name”:“百度”}

文档特征:

  1. 文档中的键/值对是有序的。
  2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
  3. MongoDB区分类型和大小写。
  4. MongoDB的文档不能有重复的键。
  5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

  1. 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
  2. 和$有特别的意义,只有在特定环境下才能使用。
  3. 以下划线"_"开头的键是保留的(不是严格要求的)。

MongoDB 数据类型

数据类型描述
String字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
Boolean布尔值。用于存储布尔值(真/假)。
Double双精度浮点值。用于存储浮点值。
Min/Max keys将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array用于将数组或列表或多个值存储为一个键。
Timestamp时间戳。记录文档修改或添加的具体时间。
Object用于内嵌文档。
Null用于创建空值。
Symbol符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID对象 ID。用于创建文档的 ID。
Binary Data二进制数据。用于存储二进制数据。
Code代码类型。用于在文档中存储 JavaScript 代码。
Regular expression正则表达式类型。用于存储正则表达式。

下面说明下几种重要的数据类型。
ObjectId

ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:
前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
接下来的 3 个字节是机器标识码
紧接的两个字节由进程 id 组成 PID
最后三个字节是随机数
在这里插入图片描述

MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象
由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:
var newObject = ObjectId()
newObject.getTimestamp()
ISODate(“2017-11-25T07:21:10Z”)
ObjectId 转为字符串
newObject.str
5a1919e63df83ce79df8b38f

字符串

BSON 字符串都是 UTF-8 编码。

时间戳

BSON 有一个特殊的时间戳类型用于 MongoDB 内部使用,与普通的 日期 类型不相关。 时间戳值是一个 64 位的值。其中:
前32位是一个 time_t 值(与Unix新纪元相差的秒数)
后32位是在某秒中操作的一个递增的序数
在单个 mongod 实例中,时间戳值通常是唯一的。
在复制集中, oplog 有一个 ts 字段。这个字段中的值使用BSON时间戳表示了操作时间。
BSON 时间戳类型主要用于 MongoDB 内部使用。在大多数情况下的应用开发中,你可以使用 BSON 日期类型。

日期

表示当前距离 Unix新纪元(1970年1月1日)的毫秒数。日期类型是有符号的, 负数表示 1970 年之前的日期。
mongo中的date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间。而系统时间使用的是GMT+0800时间,两者相差8个小时。
java里面可以通过加上注解解决
@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone=“GMT+8”)
private Date createTime;

MongoDB基本语

  • 数据库操作
  1. 创建普通数据库
    use tt //创建数据,当名字重复的时候就会切换到当前这个名字的库上
    这样就创建了一个数据库,如果什么都不操作离开的话,这个库就会被系统删除.所以我们还要执行下面的命令:
    db.usr.insert({‘name’:‘tompig’});
    db.usr.insert({‘name’:‘tompig1’,‘id’:1});
    我是随便整了2个表,这个无所谓的,反正要导入表的话就删除掉这2个就可以了,目前我们只是想让数据库保持住.
  2. 创建带有密码的数据库
    use tt
    db.addUser(‘mongodb’,‘123456’);
    mongodb是用户名,123456是密码.
    好了,这样一个数据库和对这个数据库配置用户就完成了.
  3. 查询数据库
    show dbs; //查询所有的数据库
  4. 删除当前使用的数据库
    db.dropDatabase();
  5. 数据克隆
    db.copyDatabase(“mydb”, “temp”, “127.0.0.1”); //将127.0.0.1的mydb的数据复制到temp数据库中
    db.copyDatabase( “127.0.0.1”)//复制全部
  6. 查看当前数据名字
    db.getName(); 或者使用 db;效果一样
  7. 查看当前数据库状态
    db.stats();
  8. 查看当前数据库版本
    db.version();
  9. 删除数据库
    删除前先用db查看库名,进入当前库house执行
    db.dropDatabase()
  • 集合操作

MongoDB 中使用 createCollection() 方法来创建集合。

语法格式:
db.createCollection(name, options)
参数说明:
name: 要创建的集合名称
**options:**可选参数, 指定有关内存大小及索引的选项
/
options 可以是如下参数:

字段类型描叙
capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
autoIndexId布尔(可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size数值(可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。
max数值(可选)指定固定集合中包含文档的最大数量。

创建集合实例:
db.createCollection(“mycol”, { capped : true, autoIndexId : true, size :
6142800, max : 10000 } )

删除集合:
db.collection.drop()
删除集合的时候,必须要退回到库这目录下,如果这当前集合下,是无法删除集合
use mydb //进入到mydb库
switched to db mydb//查看当前库下所有的文档
* mycol
mycol2
system.indexes
runoob*

db.mycl.drop()//删除mycol集合

  • 文档操作
1. 插入文档

文档的数据结构和JSON基本一样。MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
document=({title: ‘MongoDB’,
description: ‘MongoDB 是一个 Nosql 数据库’,
by: ‘教程’,
url: ‘http://www.baidu.com’,
tags: [‘mongodb’, ‘database’, ‘NoSQL’],
likes: 100
});//把要保存的数据赋值给一个变量document
db.col.insert(document)//直接保存变量,也可以使用db.col.save(document)或者直接把数据放入到括号里面

插入文档的时候。如果不指定 _id 字段则会自己生产一个ObjectId类型的ID。如果指定 _id 字段,则会更新该 _id 的数据。

2. 删除文档

如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:

//这是 MongoDB 是 2.6 版本以后的,语法格式如下:
b.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)
--------------------------------------------------------------------------------------------------------
参数说明:
    query :(可选)删除的文    档的条件。
    justOne : (可选)如果不设为 false 或 0,则只删除一个文档,如果不设置该参数,或使用默认值 false,
    		则删除所有匹配条件的文档。
    writeConcern :(可选)抛出异常的级别
3. 更新文档
//update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)
--------------------------------------------------------------------------------------------------------
参数说明:
    query : update的查询条件,类似sql update查询内where后面的。
    update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
    upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    writeConcern :可选,抛出异常的级别。
不使用任何操作符
{ "_id" : 12, "url" : "www", "name" : "baidu.com","age":12 }
 -------------------------------------------------------------------------------------------------------
 db.tst.update({"_id":12},{url:"www",name:"baidu"});//直接全部跟新覆盖了老的数据
  -------------------------------------------------------------------------------------------------------
{ "_id" : 12, "url" : "www", "name" : "baidu" }
$set 设置字段值

可以使用$set操作符将某个字段设置为指定值。

 db.users.update({"name":"yoona"}, {$set:{school:"Massachusetts Institute of Technology",name:"历史"}});
  //指定name=yoona的文档,修改school = "Massachusetts Institute of Technology"
$inc 增加值,操作符

$inc可以为指定的键执行(原子)更新操作,如果字段存在,就将该值增加给定的增量,如果该字段不存在,就创建该字段。

{ "_id" : ObjectId("57c3ad26d2cc0133a95bc583"), "name" : "yoona", "age" : 25, 
"school" : "xidian", "type" : 1, "favorites" : { "artist" : "Noguchi", "food" : "nougat" },
 "finished" : [ 4, 5 ] } //更新前的数据
 -------------------------------------------------------------------------------------------------------
> db.users.update({"name":"yoona"}, {$inc:{age:2}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
 -------------------------------------------------------------------------------------------------------
> db.users.find({name:"yoona"});//更新后的数据
{ "_id" : ObjectId("57c3ad26d2cc0133a95bc583"), "name" : "yoona", "age" : 27, 
"school" : "xidian", "type" : 1, "favorites" : { "artist" : "Noguchi", "food" : "nougat" },
 "finished" : [ 4, 5 ] }
upsert
 db.tst.update({"_id":12},{url:"www",name:"baidu"},{upsert:true})
 当判断条件不存在的时候将就插入数据
$unset删除指定字段
db.tst.update({age:"3333333"},{$unset:{"url":"www"}})
//删除age:"3333333"的这个文档里面url:www的子段
$rename 重命名字段名称
db.users.update({"name":"yoona"}, {$rename: {name:"userName", age:"userAge"}});
//将子段名字有name改为userName,age改为userAge
$currentDate
$curentDate设置字段值为当前日期,可以设置Date类型或者timestamp类型。

格式:

{ $currentDate: { <field1>: <typeSpecification1>, ... } }

为了演示,添加如下数据:

db.student.save({_id:1, name: "yoona", age: 24, college: "计算机学院"});

下面添加一个日期类型的"birthday"字段:

db.student.update({_id:1}, {$currentDate: {birthday: {$type: "date"}}});

最后输出结果:

    {
        "_id" : 1.0,
        "name" : "yoona",
        "age" : 24.0,
        "college" : "计算机学院",
        "birthday" : ISODate("2016-08-30T02:29:24.425Z")
    }
  • 查询语句
    db.collection.find(query, projection).pretty();
  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
  • pretty() 方法
操作格式范例RDBMS中的类似语句
等于{:}db.col.find({“by”:“菜鸟教程”}).pretty()where by = ‘50’
小于{:{$lt:}}db.col.find({“likes”:{$lt:50}}).pretty()where likes < 50
小于或等于{:{$lte:}}db.col.find({“likes”:{$lte:50}}).pretty()where likes <= 50
大于{:{$gt:}}db.col.find({“likes”:{$gt:50}}).pretty()where likes > 50
大于或等于{:{$gte:}}db.col.find({“likes”:{$gte:50}}).pretty()where likes >= 50
不等于{:{$ne:}}db.col.find({“likes”:{$ne:50}}).pretty()where likes != 50
  • ND 条件
    MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
    db.col.find({key1:value1, key2:value2}).pretty()
  • OR 条件
    OR 条件语句使用了关键字 $or,语法格式如下:
    db.col.find( { $or: [{key1: value1}, {key2:value2} ] } ).pretty()
  • AND 和 OR 联合使用
  • 以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: ‘where likes>50 AND (by = ‘菜鸟教程’ OR title = ‘MongoDB 教程’)’
>db.col.find({"likes": {$gt:50}, $or: [{"by": "教程"},{"title": "MongoDB 教程"}]}).pretty()
--------------------------------------------------------------------------------------------------------
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}
  • $type 操作符:按照数据类型查找
类型数字备注
Double1
String2
Object3
Array4
Binary data5
Undefined6已废弃。
Object id7
Boolean8
Date9
Null10
Regular Expression11
JavaScript13
Symbol14
JavaScript (with scope)15
32-bit integer16
Timestamp17
64-bit integer18
Min key255Query with -1.
Max key127
b.col.find( {"title" : { $type : 2}}) 或者 db.col.find({"title" : {$type : 'string'}})
查询title的数据类型为string的数据
  • limit()方法
db.COLLECTION_NAME.find().limit(2)
查询两条记录
  • Skip() 方法
>db.COLLECTION_NAME.find().limit(3).skip(2)
>查询3条记录,跳过前面两条数据
  • sort() 方法:排序查询
db.col.find({},{"title":1,_id:0,name:0}).sort({"likes":-1})
//{}查询条件为空,
//{"title":1,_id:0,name:0}结果集只显示title:当子段名称后面跟的数字为1:表示显示,0:隐藏
	(_id默认是显示的,其他字段默认是0)
//sort({"likes":-1})表示按照字段likes的数据进行排序,1 为升序排列,而 -1 是用于降序排列。
  • 创建索引
  • db.collection.createIndex(keys, options)//Key 值为你要创建的索引字段,1 为指定按升序创建索引,-1按降序来创建索
    ( 注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。)

db.col.createIndex({“title”:1,“description”:-1})
createIndex()也可以设置多个字段创建索引(关系数据库里面称之为复合索引)

  • 设置索引的属性
    例如:db.values.createIndex({open: 1, close: 1}, {background: true})
    通过在创建索引时加 background:true 的选项,让创建工作在后台执行
ParameterTypeDescription
backgroundBoolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。
uniqueBoolean建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDupsBoolean3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
sparseBoolean对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
vindex version索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_languagestring对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_overridestring对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值