MongoDB初步认识

NoSQL数据库

NoSQL数据库姑且这么理解是为了解决传统关系型数据库在高并发、大数据场景中的劣势而诞生的一种数据库。NoSQL是一类数据库的统称包括,根据数据模型对其进行分类如下。
在这里插入图片描述

从图中可以看到MongoDB的数据模型为文档型。

基本使用

库操作

一个mongodb中可以建立多个数据库。MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中,
“show dbs” 命令可以显示所有数据的列表。

>show dbs

在这里插入图片描述

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

>db

在这里插入图片描述
选择数据库

>use local

在这里插入图片描述

创建集合

执行插入操作会自动创建集合

db.sunyang.insert({"age":"27"})
show tables

在这里插入图片描述

使用命令创建

db.createCollection("sunyang2")

在这里插入图片描述

db.createCollection(name, options)

其中options包括

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

删除集合

db.collection.drop()

插入集合

db.COLLECTION_NAME.insert(document)
db.col.save(document) 

批量插入

var res = db.collection.insertMany([{"b": 3}, {'c': 4}])

document在mongodb是oracle中一行记录的意思,在这里是BSON串。
BSON和JSON区别

(1)更快的遍历速度
对JSON格式来说,太大的JSON结构会导致数据遍历非常慢。在JSON中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,比如括号的匹配,而BSON对JSON的一大改进就是,它会将JSON的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取了。
(2)操作更简易
对JSON来说,数据存储是无类型的,比如你要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用BSON,你可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。当然,在MongoDB中,如果数字从整形增大到长整型,还是会导致数据总长变大的。
(3)增加了额外的数据类型
JSON是一个很方便的数据交换格式,但是其类型比较有限。BSON在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成JSON。大大减少了计算开销和数据大小。
但是,在有的时候,BSON相对JSON来说也并没有空间上的优势,比如对{“field”:7},在JSON的存储上7只使用了一个字节,而如果用BSON,那就是至少4个字节(32位)
目前在10gen的努力下,BSON已经有了针对多种语言的编码解码包。并且都是Apache 2 license下开源的。并且还在随着MongoDB进一步地发展。

一个BSON例子:

{
    title:"MongoDB",
    last_editor:"192.168.1.122",
    last_modified:new Date("27/06/2011"),
    body:"MongoDB introduction",
    categories:["Database","NoSQL","BSON"],
    revieved:false
}

文档更新

语法

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

例如

db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})

多行更新

db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})

文档替换

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

实例:

>db.col.save({
    "_id" : ObjectId("38f54h39f5n723fv4"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "test",
    "url" : "test",
    "tags" : [
            "mongodb",
            "NoSQL"
    ],
    "likes" : 110
})

更多实例


只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );

全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );

全部添加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );

全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );

只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

文档删除

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。

如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:

db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):

db.col.remove({})

remove() 方法 并不会真正释放空间。

需要继续执行 db.repairDatabase() 来回收磁盘空间。

> db.repairDatabase()
或者
> db.runCommand({ repairDatabase: 1 })

文档查询

db.collection.find(query, projection)

query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

易读可以使用 pretty() 方法,好像在linux中也有这个语法。

db.col.find().pretty()
And
db.sunyang.find({key1:value1, key2:value2}).pretty()

相当于key1和key2是and连接查询

Or
>db.sunyang.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()
AND 和 OR 联合使用
db.sunyang.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
条件查询

(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte

db.sunyang.find({score: {$gt : 100}})

类似于

Select * from sunyang where score > 100;

其他

db.sunyang.find({score: {$gte : 100}})
db.sunyang.find({score: {$lt : 150}})
db.sunyang.find({score: {$lte : 150}})
db.sunyang.find({score: {$lt :200, $gt : 100}})

类似于

Select * from sunyangwhere score>100 AND  score<200;
模糊查询

查询 title 包含"教"字的文档:

db.col.find({title:/教/})

查询 title 字段以"教"字开头的文档:

db.col.find({title:/^教/})

查询 titl e字段以"教"字结尾的文档:

db.col.find({title:/教$/})
$type

含义:获取 “sunyang” 集合中 title 为 String 的数据

db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})
分页

读取指定数量

db.COLLECTION_NAME.find().limit(NUMBER)

分页读

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

实例:

>db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
{ "title" : "Java 教程" }
排序

在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

db.COLLECTION_NAME.find().sort({KEY:1})

实例

db.sunyang.find({},{"title":1,_id:0}).sort({"scores":-1})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值