之前的公司是使用oracle,现在考虑到就要接触mongo,记录下学到的皮毛,方便回忆。
什么是mongodb?
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
看了上面两张表,那就什么都豁然开朗啦~!!!!
数据库
一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
db 命令用于查看当前操作的文档(数据库):
>db
test
show dbs 命令显示mongo所有数据库:
> show dbs
local 0.078GB
test 0.078GB
use database _name 命令切换到指定的数据库:
> use local
switched to db local
> db
local
文档(相当于sql的每行数据)
文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型。
{"id":1,"name":"liyue","sex":"girl"}
集合(数据表)
{"id":1,"name":"liyue","sex":"girl"}
{"id":2,"name":"liweien","sex":"boy"}
{"id":3,"name":"haha"}
集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的
表格。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
查看数据库中所有集合:
>show collections
col liyue table1
创建mongo数据库
use database_name
数据库不存在创建该数据库,存在则切换到该数据库。
> use liyue
switched to db liyue
> db
liyue
删除mongo数据库
db.dropDatabase() 注意大写
删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。
例子:
首先,查看所有数据库:
> show dbs
local 0.078GB
runoob 0.078GB
test 0.078GB
接下来我们切换到数据库 runoob:
> use runoob
switched to db runoob
>
执行删除命令:
> db.dropDatabase()
{ "dropped" : "runoob", "ok" : 1 }
最后,我们再通过 show dbs 命令数据库是否删除成功:
> show dbs
local 0.078GB
test 0.078GB
删除集合(数据表)
语法格式:db.collection_name.drop()
>db.table.find()
{"_id":ObjectId("8698623646"),"name":"liyue"}
>db.table.drop()
true
>
插入文档(行数据)
使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.collection_name.insert(document)
注意:如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
插入一个文档:
>db.col.insert({title: 'Mongo',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'liyu',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
查看该文档:
> db.col.find()
{ "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "Mongo", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "liyu", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
例外还可以先把要插入的文档保存为一个变量document中,如:document ({....}) 、 document [{......},{......},{.......}]
> document=({title: 'Mongo',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'liyu',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
执行后显示:
{
"title" : "Mongo",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "liyu",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
插入到集合中:
>db.col.insert(document)
WriteResult({"nIserted":1})
MongoDB 删除文档
MongoDB remove()函数是用来移除集合中的数据。MongoDB数据更新可以使用 update()函数。 在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
语法:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
参数说明:
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档。
writeConcern :(可选)抛出异常的级别。
例子:
删除集合col中id:1的文档,
使用find()函数查看col集合中所有文档,
> db.col.find()
{ "_id" : ObjectId("56066169ade2f21f36b03137"), "id" : "1", "description" : "Mongo","tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
使用remove()删除id:1 的文档:
>db.col.remove({id:1})
WriteResult({ "nRemoved" : 1 }) # 删除了一条数据
>db.col.find()
…… # 没有数据
如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
>db.table1.remove({id:2},1)
WriteResult({"nRemove":1})
如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令,包括自增id也会删除,再次插入数据id从1开始):
>db.col.remove({})
>db.col.find()
>
mongoDB更新文档:
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。
1.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 :可选,抛出异常的级别。
例子:
首先在col 集合中insert文档:
>db.col.insert({
title: 'MongoDB',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'liyu',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
更新title:"MongoDB"为title:"hahaha":
db.col_name.update({条件},{$set:{列名:"更新值"}})
以上语句只会修改第一条发现的文档!
>db.col.update({'title':'MongoDB'},{$set:{'title':'hahaha'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 输出信息
> db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "hahaha",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "liyu",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
如果你要修改多条相同的文档,则需要设置 multi 参数为 true。
>db.col.update({title:mongodb},{$set:{by:"liyue"}},{multi:true})
multi默认为false,也就是只会更新符合条件的第一条数据,当multi设置为true时,就会更新符合条件的所有数据了!
2.save()通过传入新文档代替已有的文档,语法如下:
db.collection.save(
<document>, ---------》 {原数据的"_id":....,新数据}
{
writeConcern: <document>
}
)
参数说明:document : 文档数据。writeConcern :可选,抛出异常的级别。
例子:
以下实例中我们替换了 _id 为 56064f89ade2f21f36b03136 的文档数据:
原数据:
>db.col.find({_id:ObjectId("56064f89ade2f21f36b03136")})
{"_id":ObjectId("56064f89ade2f21f36b03136"),"name":"liyue"}
save()替换它:
>db.col.save({
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "Runoob",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
})
替换成功后,我们可以通过 find() 命令来查看替换后的数据
>db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "Runoob",
"url" : "http://www.runoob.com",
"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 );
MongoDB 查询文档(select)
语法:>db.集合名.find()find() 方法以非结构化的方式来显示所有文档。格式化的方式显示文档可以使用 pretty() 方法,语法格式如下:>db.col.find().pretty()pretty() 方法以格式化的方式来显示所有文档。
例子:查询table1中的所有数据
> db.col.find().pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "liyue",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
Mongo 与 SQL Where 语句比较
如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value> } | db.col.find({"by":"me"}).pretty() | where by = 'me' |
小于 $It | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 $Ite | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 $gt | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 $gte | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 $ne | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
mongodb的and条件:(传入多个键以逗号隔开就是and)
MongoDB 的 find() 方法可以
传入多个键(key),每个键(key)以逗号隔开,与 SQL 的 AND 条件一样。
语法格式如下:
语法格式如下:
>db.col.find({key1:value1, key2:value2}).pretty()
例子如下:
> db.col.find({"by":"liyu", "title":"MongoDB "}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
类似sql中:select * from col where by = "liyu" and title = "MongoDB"
MongoDB OR 条件 $or
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
例子:查询age:25 或者 name:liyue 的所有数据
查询by:liyu 或者title:MongoDB的所有数据
>db.col.find({$or:[{"by":"liyu"},{"title": "MongoDB"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "liyu",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
MongoDB Limit() 方法
使用MongoDB的Limit方法,显示数据条数,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。语法:
db.collection_name.find().limit(n) 返回n条数据
例子:
>db.test.find().limit(2).pretty()
注意:没有指定limit()方法,则默认显示集合中所有的文档(数据)
mongodb中skip()方法
使用skip()方法来 跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
语法格式:
>db.collection_name.find().limit(n).skip(m)
例子:
以下实例只会显示test集合中第二条数据:
>db.test.find().limit(1).skip(1).pretty()
注意:skip(m) m默认为0
MongoDB 排序 (order by)
sort()方法在MongoDB中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
语法
>db.collection_name.find().sort({KEY:1})
例子:
默认sort({key:1}),顺序显示!!!