MongoDB
- 1.创建数据库
- 2.查看当前所在数据库
- 3.查看所有数据库
- 4.删除数据库
- 5.创建集合(表)
- 6.查看所有集合(表)
- 7.删除集合(表)
- 8.插入文档
- 9.更新文档
- 10.删除文档
- 11.查询文档
- 1).模糊查询
- 12.条件操作符
- 13.$type类型操作符
- 14.Limit与Skip方法
- 15.sort()排序方法
- 16.createIndex()创建索引
- 循环生成数据
1.创建数据库
1).数据库存在就是切换;
2).数据库不存在则创建。
语法格式:
use + 数据库的名字
例:
> use FX
switched to db FX
2.查看当前所在数据库
语法格式:
db
例:
> db
test
3.查看所有数据库
刚创建的数据库里边没有数据的话是不会显示在数据库列表中的,随便添加一组数据即可显示。
语法格式:
show dbs
例:
> show dbs
FX 0.000GB
admin 0.000GB
config 0.000GB
local 0.000GB
4.删除数据库
删除当前的数据库,你可以切换到指定的数据库下再进行删除。最后可以用查看所有数据库来验证一下是否删除成功。
语法格式:
db.dropDatabase()
例:
> db.dropDatabase()
{ "dropped" : "FXXX", "ok" : 1 }
5.创建集合(表)
在已有的数据库内创建一个集合。
1).语法格式:
db.createCollection(“集合名字”)
例:
> db.createCollection("rubbbbb")
{ "ok" : 1 }
2).语法格式:
db.createCollection(name, options)
说明:
- name: 要创建的集合名称
- options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数:
字段 | 类型 | 描述 |
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | 3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数。如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
下面是带有几个关键参数的 createCollection() 的用法:
创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
例:
> db.createCollection("mycol", { capped : true, autoIndexId : true, size :
6142800, max : 10000 } )
{ "ok" : 1 }
3).语法格式:
db.集合名字.insert({name:‘张三’})
也可以直接加上集合名字并设置内容来创建。
1.已经存在集合则添加内容;
2.不存在集合则创建集合并且添加内容。
例:
> db.ABC.insert({name:'张三'})
WriteResult({ "nInserted" : 1 })
6.查看所有集合(表)
查看当前数据库的所有集合。
语法格式:
show tables或者show collections
例:
> show tables
fx
> show collections
fx
7.删除集合(表)
参数说明:
- 无
语法格式:
db.集合名字.drop()
返回值:
如果成功删除选定集合,则drop() 方法返回 true,否则返回 false。
例:
可以先查看已有的所有集合,删除了之后再次查看所有集合来验证是否成功。
> db.rubbbbb.drop()
true
8.插入文档
1).插入相同的内容会重复生成,但是_id不同。
语法格式:
db.集合名字.insert({name:‘张三’})
例:
> db
FX
> db.fx.insert({name:'fx'})
WriteResult({ "nInserted" : 1 })
> db.fx.insert({name:'fx'})
WriteResult({ "nInserted" : 1 })
>
2).向集合中插入一个新的文档。
语法格式:
db.集合名字.insertOne({name:‘zs’})
例:
> db.fx.insertOne({name:'zs'})
{
"acknowledged" : true,
"insertedId" : ObjectId("5fbdeb5f1820a7cabe1bd4ab")
}
3).向集合中加入多个文档。
语法格式:
db.集合名字.insertMany([{name:‘ls’},{name:‘ww’}])
例:
> db.fx.insertMany([{name:'ls'},{name:'ww'}])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5fbded201820a7cabe1bd4ac"),
ObjectId("5fbded201820a7cabe1bd4ad")
]
}
9.更新文档
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如inc…)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
1).更新一条数据。此处是将name属性的内容”fx“的第一条数据内容改为”jintianshigehaorizi“。
语法格式:
db.集合名字.update({‘name’:‘fx’},{$set:{‘name’:‘jintianshigehaorizi’}})
例:
> db.fx.update({'name':'fx'},{$set:{'name':'jintianshigehaorizi'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.fx.find().pretty()
{
"_id" : ObjectId("5fbdc82ecaa05509cc59f4d8"),
"name" : "jintianshigehaorizi"
}
2).更改多条数据:
- 将所有name为”fx“的数据的属性都改为”jintianshigehaorizi“。
语法格式:
db.集合名字.updateMany({‘name’:‘fx’},{$set:{‘name’:‘jintianshigehaorizi’}})
例:
> db.fx.updateMany({'name':'fx'},{$set:{'name':'jintianshigehaorizi'}})
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
- 使用方法一,不过需要在其后增加一个参数multi,此参数默认为false。
语法格式:
db.集合名字.update({‘name’:‘fx’},{$set:{‘name’:‘jintianshigehaorizi’}},{multi:true})
10.删除文档
用来删除集合中的数据。
- 删除指定条件的文档。
语法格式:
db.集合名字.deleteOne({name:‘bbbbbb’})
例:
> db.fx.find()
{ "_id" : ObjectId("5fbe00b81820a7cabe1bd4af"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01071820a7cabe1bd4b0"), "name" : "bbbbbb" }
{ "_id" : ObjectId("5fbe01071820a7cabe1bd4b1"), "name" : "cccccccc" }
> db.fx.deleteOne({name:'bbbbbb'})
{ "acknowledged" : true, "deletedCount" : 1 }
> db.fx.find()
{ "_id" : ObjectId("5fbe00b81820a7cabe1bd4af"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01071820a7cabe1bd4b1"), "name" : "cccccccc" }
>
- 删除多个文档
语法格式:
db.集合名字.deleteMany({name:‘bbbbbb’})
例:
> db.fx.deleteMany({name:'bbbbbb'})
{ "acknowledged" : true, "deletedCount" : 3 }
> db.fx.find()
{ "_id" : ObjectId("5fbe00b81820a7cabe1bd4af"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01071820a7cabe1bd4b1"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01f51820a7cabe1bd4b3"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01f71820a7cabe1bd4b5"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01f81820a7cabe1bd4b7"), "name" : "cccccccc" }
- 删除所有文档,如果文档中所有数据都没用了,那么直接删除集合更高效。
例:
> db.fx.remove({})
WriteResult({ "nRemoved" : 4 })
> db.fx.find()
>
11.查询文档
下列方法都可以显示当前集合内的所有文档数据。不同的是pretty()是以格式化的方式来显示且更易读。findOne()只返回一个文档。
语法格式:
- db.集合名字.findOne()
- db.集合名字.find()
- db.集合名字.find().pretty()
例:
> db.fx.find().pretty()
{ "_id" : ObjectId("5fbdeb5f1820a7cabe1bd4ab"), "name" : "zs" }
{ "_id" : ObjectId("5fbded201820a7cabe1bd4ac"), "name" : "ls" }
{ "_id" : ObjectId("5fbded201820a7cabe1bd4ad"), "name" : "ww" }
{ "_id" : ObjectId("5fbdeeed1820a7cabe1bd4ae"), "name" : "aaaaaaaaa" }
> db.fx.find()
{ "_id" : ObjectId("5fbdeb5f1820a7cabe1bd4ab"), "name" : "zs" }
{ "_id" : ObjectId("5fbded201820a7cabe1bd4ac"), "name" : "ls" }
{ "_id" : ObjectId("5fbded201820a7cabe1bd4ad"), "name" : "ww" }
{ "_id" : ObjectId("5fbdeeed1820a7cabe1bd4ae"), "name" : "aaaaaaaaa" }
MongoDB与RDBMS Where语句比较
MongDB AND条件
find().pretty()还可以传入多个键,每个键用逗号隔开。
>db.fx.find({key1:value1, key2:value2}).pretty()
MongDB OR条件
例:
> db.fx.find({$or:[{name:'cccccccc'},{name:'1234'}]}).pretty()
{ "_id" : ObjectId("5fbe00b81820a7cabe1bd4af"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01071820a7cabe1bd4b1"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01f51820a7cabe1bd4b3"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01f71820a7cabe1bd4b5"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01f81820a7cabe1bd4b7"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe12061820a7cabe1bd4b8"), "name" : "1234" }
AND 和 OR 联合使用
例:
> db.fx.find({"name":{$gt:'155'},$or:[{"name":"cccccccc"},{"name":"188"}]}).pretty()
{ "_id" : ObjectId("5fbe00b81820a7cabe1bd4af"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01071820a7cabe1bd4b1"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01f51820a7cabe1bd4b3"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01f71820a7cabe1bd4b5"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01f81820a7cabe1bd4b7"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe12061820a7cabe1bd4b8"), "name" : "188" }
1).模糊查询
1).包含xx字的文档:
例:
> db.fx.find({name:/x/})
{ "_id" : ObjectId("5fbe17711820a7cabe1bd4b9"), "name" : "fxxxx", "age" : 88, "sex" : 1 }
2).以xx字开头的文档:
例:
> db.fx.find({name:/^f/})
{ "_id" : ObjectId("5fbe17711820a7cabe1bd4b9"), "name" : "fxxxx", "age" : 88, "sex" : 1 }
3).以xx字结尾的文档
例:
> db.fx.find({name:/x$/})
{ "_id" : ObjectId("5fbe17711820a7cabe1bd4b9"), "name" : "fxxxx", "age" : 88, "sex" : 1 }
12.条件操作符
用于比较两个表达式并从mongoDB集合中获取数据。
MongoDB条件操作符有:
操作 | 写法 | 含义 |
大于 | $gt | greater than > |
小于 | $lt | less than < |
大于等于 | $gte | gt equal >= |
小于等于 | $lte | lt equal <= |
等于 | $eq | equal = |
非等 | $ne | not equal != |
我的数据库是FX,集合是fx,下列例子的意思是age大于10的显示出来。其余操作符用法一样。
例:
> db.fx.find().pretty()
{
"_id" : ObjectId("5fbe17711820a7cabe1bd4b9"),
"name" : "fxxxx",
"age" : 88,
"sex" : 1
}
{
"_id" : ObjectId("5fbe17811820a7cabe1bd4ba"),
"name" : "zz",
"age" : 8,
"sex" : 1
}
>
> db.fx.find({age:{$gt:10}})
{ "_id" : ObjectId("5fbe17711820a7cabe1bd4b9"), "name" : "fxxxx", "age" : 88, "sex" : 1 }
大于和小于结合使用
例:
age中大于1小于88的显示出来。
> db.fx.find({age:{$gt:1,$lt:88}})
{ "_id" : ObjectId("5fbe17811820a7cabe1bd4ba"), "name" : "zz", "age" : 8, "sex" : 1 }
13.$type类型操作符
类型 | 数字 | 备注 |
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃。 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1. |
Max key | 127 |
例:
> db.fx.find({name:{$type:2}})
> //或者
> db.fx.find({name:{$type:'string'}})
14.Limit与Skip方法
1).Limit()
接受一个数字参数,表示该参数从MongoDB中读取多少条数据。
a.直接使用
语法格式:
db.集合名字.find().limit(4)
例:
表示在所有的文档中只读取4条,从第一条开始。
> db.fx.find().limit(4)
{ "_id" : ObjectId("5fbe00b81820a7cabe1bd4af"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01071820a7cabe1bd4b1"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01f51820a7cabe1bd4b3"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe01f71820a7cabe1bd4b5"), "name" : "cccccccc" }
b.限制显示的数量以及内容
语法格式:
db.集合名字.find({},{age:1,_id:0}).limit(7)
例:
表示指定显示的信息以及读取的条数。因为我指定了只显示age这个内容,后边的1表示显示、0表示不显示,总共显示7条信息。我当前只有第七条有age这个内容,所以前面6条都是空的。
> db.fx.find({},{age:1,_id:0}).limit(7)
{ }
{ }
{ }
{ }
{ }
{ }
{ "age" : 88 }
2).Skip()
接受一个数字参数,表示跳过n条,从第n+1条开始显示。
a.单独使用
语法格式:
db.集合名字.find().skip(4)
例:
这里跳过了前4条,从第5条开始输出数据。
> db.fx.find().skip(4)
{ "_id" : ObjectId("5fbe01f81820a7cabe1bd4b7"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe12061820a7cabe1bd4b8"), "name" : "188" }
{ "_id" : ObjectId("5fbe17711820a7cabe1bd4b9"), "name" : "fxxxx", "age" : 88, "sex" : 1 }
{ "_id" : ObjectId("5fbe17811820a7cabe1bd4ba"), "name" : "zz", "age" : 8, "sex" : 1 }
b.还可以和limit()方法组合使用
语法格式:
db.集合名字.find().skip(4).limit(4)
例:
跳过了前4条,从第5条开始总共显示4条数据,也就是第5、6、7、8条数据会显示。
> db.fx.find().skip(4).limit(4)
{ "_id" : ObjectId("5fbe01f81820a7cabe1bd4b7"), "name" : "cccccccc" }
{ "_id" : ObjectId("5fbe12061820a7cabe1bd4b8"), "name" : "188" }
{ "_id" : ObjectId("5fbe17711820a7cabe1bd4b9"), "name" : "fxxxx", "age" : 88, "sex" : 1 }
{ "_id" : ObjectId("5fbe17811820a7cabe1bd4ba"), "name" : "zz", "age" : 8, "sex" : 1 }
补充说明:
- skip和limit方法只适合小数据量分页,如果是百万级效率就会非常低,因为skip方法是一条条数据书过去的,建议使用where_limit
- 或者:
db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10)
- 此处的skip、limit和sort三者的执行顺序和位置无关,但是在具有管道流的特质的地方是按顺序执行。
15.sort()排序方法
指定属性进行排序,1为升序,-1为降序。
语法格式:
- 升序 db.集合名字.find({},{_id:0}).sort({name:1})
- 降序 db.集合名字.find({},{_id:0}).sort({name:-1})
例:
此处不显示id因为设置为0,将name数据按升序进行排列。
> db.fx.find({},{_id:0}).sort({name:1})
{ "name" : 15 }
{ "name" : 15 }
{ "name" : 55 }
{ "name" : 55 }
{ "name" : 32165 }
{ "name" : 65429 }
{ "name" : 352198 }
{ "name" : "188" }
{ "name" : "fxxxx", "age" : 88, "sex" : 1 }
{ "name" : "zz", "age" : 8, "sex" : 1 }
补充说明:
skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。
16.createIndex()创建索引
索引能够极大的提高查询的效率,存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或者多列的值进行排序的一种结构。
循环生成数据
语法格式:
for(i=0;i<10000;i++){db.集合名.insert({“i”:i})}
例1:
循环生成了10000条数据,内容是i:i++
> for(i=0;i<10000;i++){db.a.insert({"i":i})}
WriteResult({ "nInserted" : 1 })
例2:
循环生成一百万个数据,并且其中的age属性随机
> for(i=0;i<1000000;i++){db.a.insert({"i":i,'name':'fx'+i,'age':Math.floor(Math.random()*120)})}