文章目录
MongoDB创建数据库
语法
MongoDB创建数据库的语法如下:
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
实例
以下实例我们创建了数据库runoob
> use runoob
switched to db runoob
> db
runoob
>
如果你想查看所有数据库,可以使用show dbs命令:
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
>
可以看到我们刚创建的数据库runoob并不在数据库的列表中,要显示它,我们需要向runoob数据库插入一些数据。
> db.runoob.insert({"name":"菜鸟教程"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
runoob 0.000GB
test 0.000GB
>
MongoDB中默认的数据库位test,如果你没有创建新的数据库,集合将存放在test数据库中。
注意:在MongoDB中,集合只有在内容插入后才会创建!就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
MongoDB删除数据库
语法
MongoDB删除数据库的语法格式如下:
db.dropDatabase()
删除当前数据库,默认为test,你可以使用db命令查看当前数据库名。
实例
以下实例我们删除了数据库runoob。
首先,查看所有数据库:
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
runoob 0.000GB
test 0.000GB
>
接下来,切换到runoob数据库:
> use runoob
switched to db runoob
>
执行删除命令
> db.dropDatabase()
{ "ok" : 1 }
最后,我们再通过show dbs命令查看数据库是否删除成功:
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
>
删除集合
集合删除语法格式如下:
db.collection.drop()
以下实例删除了runoob数据库中的集合site:
> use runoob
switched to db runoob
> db.createCollection("runoob") # 先创建集合,类似数据库中的表
{ "ok" : 1 }
> show tables # show collections 命令其实更加准确
runoob
> db.runoob.drop()
true
> show tables
>
MongoDB创建集合
MongoDB中使用createCollection()方法来创建集合。
语法格式:
db.createCollection(name,options)
参数说明:
- name:要创建的集合名称
- options:可选参数,指定有关内存大小及索引的选项
options可以是如下参数:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为true时,必须指定size参数 |
autolndexId | 布尔 | 3.2后不再支持该参数。 (可选)如果为true,自动在_id字段创建索引。默认为false。 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数。如果capped为true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
在插入文档时,MongoDB首先检查固定集合的size字段,然后检查max字段。
实例
在test数据库中创建runoob集合:
>use test
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }
>
如果要查看已有集合,可以使用show collections或show tables命令:
> show tables
runoob
>
下面是带有几个关键参数的createCollection()的用法:
创建固定集合mycol,整个集合空间的大小6142800 B,文档最大个数为10000个。
> db.createCollection("mycol",{capped:true,autoIndexId:true,size:6142800,max:10000})
{
"note" : "The autoIndexId option is deprecated and will be removed in a future release",
"ok" : 1
}
>
在MongoDB中,你不需要创建集合。当你插入一些文档时,MongoDB会自动创建集合。
> db.mycol2.insert({"name":"自动创建"})
WriteResult({ "nInserted" : 1 })
> show collections
mycol
mycol2
runoob
>
MongoDB删除集合
MongoDB中使用drop()方法来删除集合。
语法格式:(无参数说明)
db.collection.drop()
返回值
如果成功删除选定集合,则drop()方法返回true,否则返回false。
实例
在数据库test中,我们可以先通过show collections命令查看已存在的集合:
> use test
switched to db test
> show collections
mycol
mycol2
runoob
>
接着删除mycol2:
> db.mycol2.drop()
true
>
通过show collections再次查看数据库test中的集合:
> show collections
mycol
runoob
>
可以看出,mycol2已经被删除。
MongoDB插入文档
文档数据结构和JSON基本一样。
所有存储在集合中的数据都是BSON格式。
BSON是一种类似JSON的二进制形式的存储格式,是Binary JSON的简称。
插入文档
MongoDB使用insert()或save()方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)
- save():如果_id主键存在则更新数据,如果不存在就插入数据。该方法新版本中已经废弃,可以使用db.collection.insertOne()或db.collection.replaceOne()来代替。
- insert():若插入的主键已经存在,则会抛出org.springframework.dao.DuplicateKeyException异常,提示主键重复,不保存当前数据。
3.2版本之后新增了db.collection.insertOne()和db.collection.insertMany()。
db.collection.insertOne()用于向集合插入一个新文档,语法格式如下:
db.collection.insertOne(
<document>,
{
writeConcern:<document>
}
)
db.collection.insertMany()用于向集合插入一个或多个文档,语法格式如下:
db.collection.insertMany(
[<document1>,<document2>,...],
{
writeConcern:<document>,
ordered:<bollean>
}
)
参数说明:
- document:要写入的文档。
- writeConcern:写入策略,默认为1,即要求确认写操作,0是不要求。
- ordered:指定是否按顺序写入,默认为true,按顺序写入。
实例
以下文档可以存储在MongoDB的runoob数据库的col集合中:
> db.col.insert({title:'MongoDB教程',description:'MongoDB是一个Nosql数据库',by:'菜鸟教程',url:'http://www.runoob.com',tags:['mongodb','database','NoSQL'],likes:100})
WriteResult({ "nInserted" : 1 })
以上实例中col是我们的集合名,如果该集合不咋数据库中,MongoDB会自动创建该集合并插入文档。
查看已插入文档:
> db.col.find()
{ "_id" : ObjectId("623ddb8568de0f490d5a2613"), "title" : "MongoDB教程", "description" : "MongoDB是一个Nosql数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
>
我们也可以将数据定义为一个变量,如下所示:
> doucment=({title:'MongoDB教程',description:'MongoDB是一个Nosql数据库',by:'菜鸟教程',url:'http://www.runoob.com',tags:['mongodb','database','NoSQL'],likes:100});
执行后结果如下所示:
{
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
执行插入操作:
> db.col.insert(doucment)
WriteResult({ "nInserted" : 1 })
>
插入文档也可以使用db.col.save(document)命令。如果不指定_id字段save()方法类似于insert()方法。如果指定_id字段,则会更新该_id的数据。
MongoDB更新文档
MongoDB使用update()和save()方法来更新集合中的文档。下面我们来看看两个函数的应用及区别。
update()方法
update()方法用于更新已存在的文档。语法如下:
db.collection.update(
<query>,
<update>,
{
upsert:<boolean>,
multi:<boolean>,
writeConcern:<document>
}
)
参数说明:
- query:update的查询条件,类似sql update查询里where后面的。
- update:update的对象和一些更新的操作符(如
$
,$inc
…)等,也可以理解为sql update查询内set后面的 - upset:可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认为false,不插入。
- multi:可选,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern:可选,抛出异常的级别。
实例
我们在集合col中插入以下数据:
> db.col.insert({title:'MongoDB教程',description:'MongoDB是一个Nosql数据库',by:'菜鸟教程',url:'http://www.runoob.com',tags:['mongodb','database','NoSQL'],likes:100})
WriteResult({ "nInserted" : 1 })
>
接着通过update()方法来更新标题(title):
> db.col.update({'title':'MongoDB教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find().pretty()
{
"_id" : ObjectId("623e7e888daf7d2fb0e3d27a"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
可以看到标题(title)由原来的“MongoDB教程”更新为了“MongoDB”。
以上语句只会修改第一条发现的文档,如果你需要修改多条相同的文档,则需要设置multi参数为true。
>db.col.update({'title':'MongoDB教程'},{$set:{'title':'MongoDB'}},{multi:true})
save()方法
save()方法通过传入的文档来替换已有文档,_id主键存在就更新,不存在就插入。语法格式如下:
db.collection.save(
<document>,
{
writeCocern:<document>
}
)
参数说明:
- document:文档数据。
- writeConcern:可选,抛出异常级别。
实例
以下实例中我们替换了_id为623e7e888daf7d2fb0e3d27a的文档数据
> db.col.save({
... "_id" : ObjectId("623e7e888daf7d2fb0e3d27a"),
... "title" : "MongoDB",
... "description" : "MongoDB是一个Nosql数据库",
... "by" : "菜鸟教程",
... "url" : "http://www.runoob.com",
... "tags" : [
... "mongodb",
... "database",
... "NoSQL"
... ],
... "likes" : 110
... })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
替换成功后,我们可以通过find()命令来查看替换后的数据
> db.col.find().pretty()
{
"_id" : ObjectId("623e7e888daf7d2fb0e3d27a"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"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删除文档
MongoDB使用remove()函数来移除集合中的数据。
MongoDB数据更新可以使用update()函数。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
语法
remove()方法的基本语法格式如下所示:
db.collection.remove(
<query>,
<justOne>
)
如果你的MongoDB时.6版本以后的,语法格式如下:
db.collection.remove(
<query>,
{
justOne:<boolean>,
writeCocern:<document>
}
)
参数说明:
- query:(可选)删除的文档的条件。
- justOne:(可选)如果设为true或1,则只删除一个文档,如果不设置该参数,或使用默认值false,则删除所有匹配条件的文档。
- writeConcern:(可选)抛出异常的级别。
实例
以下文档我们执行两次插入操作:
> db.col.insert({"title" : "MongoDB", "description" : "MongoDB是一个Nosql数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 110 })
WriteResult({ "nInserted" : 1 })
使用find()函数查询数据:
> db.col.find()
{ "_id" : ObjectId("623e7e888daf7d2fb0e3d27a"), "title" : "MongoDB", "description" : "MongoDB是一个Nosql数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 110 }
{ "_id" : ObjectId("623ec4d0f742a6c9a8ca3bb2"), "title" : "MongoDB", "description" : "MongoDB是一个Nosql数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 110 }
{ "_id" : ObjectId("623ec588f742a6c9a8ca3bb3"), "title" : "MongoDB教程", "description" : "MongoDB是一个Nosql数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 110 }
>
接下来,我们移除title为‘MongoDB教程’的文档:
> db.col.remove({'title':'MongoDB教程'})
WriteResult({ "nRemoved" : 1 }) # 删除了1条数据
> db.col.find() })
{ "_id" : ObjectId("623e7e888daf7d2fb0e3d27a"), "title" : "MongoDB", "description" : "MongoDB是一个Nosql数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 110 }
{ "_id" : ObjectId("623ec4d0f742a6c9a8ca3bb2"), "title" : "MongoDB", "description" : "MongoDB是一个Nosql数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 110 }
> # 剩余两条数据
如果你只想删除第一条找到的记录可以设置justOne为1,如下所示:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
如果你想删除所有数据,可以使用以下方式(类似常规SQL的truncate命令):
>db.col.remove({})
>db.col.find()
>
MongoDB查询文档
MongoDB查询文档使用find()方法。find()方法以非结构化的方式来显示所有文档。
语法
MongoDB查询数据的语法格式如下:
db.collection.find(query,projection)
- query:可选,使用查询操作符指定查询条件
- projection:可选,使用投影操作符指定返回的键。查询时返回文档中所有键值,只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用pretty()方法,语法格式如下:
>db.col.find().pretty()
实例
以下实例我们查询了集合col中的数据:
> db.col.find().pretty()
{
"_id" : ObjectId("623e7e888daf7d2fb0e3d27a"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 110
}
{
"_id" : ObjectId("623ec4d0f742a6c9a8ca3bb2"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 110
}
>
除了find()方法之外,还有一个findOne()方法,它只返回一个文档。
> db.col.findOne()
{
"_id" : ObjectId("623e7e888daf7d2fb0e3d27a"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 110
}
>
MongoDB与RDBMS Where语句比较
如果你熟悉常规的SQL语句,通过下表可以更好的理解MongoDB的条件查询语句:
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value>} | db.col.find({"by":"菜鸟教程")}.pretty() | where by = ‘菜鸟教程’ |
小于 | {<key>:{$lt:<value>}} | db.col.find({"like":{$lt:50}}).pretty() | where likes<50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes<=50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes!=50 |
MongoDB AND条件
MongoDB的find()方法可以传入多个键(key),每个键(key)以逗号隔开,即常规SQL的AND条件。
语法格式如下:
>db.col.find({key1:value1,key2:value2}).pretty()
实例
以下实例通过by和title键来查询菜鸟教程中MongoDB的数据
> db.col.find({"by":"菜鸟教程","title":"MongoDB"}).pretty()
{
"_id" : ObjectId("623e7e888daf7d2fb0e3d27a"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 110
}
{
"_id" : ObjectId("623ec4d0f742a6c9a8ca3bb2"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 110
}
>
以上语句类似于WHERE语句:WHERE by=‘菜鸟教程’ AND title=‘MongoDB’
MongoDB OR条件
MongoDB OR条件语句使用了关键字$or
语法格式如下:
>db.col.find(
{
$or:[
{key1:value1},{key2:value2}
]
}
).pretty()
实例
以下实例中,我们演示了查询键by值为菜鸟教程或键title值为MongoDB的文档
> db.col.find({$or:[{"by":"菜鸟教程"},{"title":"MongoDB"}]}).pretty()
{
"_id" : ObjectId("623e7e888daf7d2fb0e3d27a"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 110
}
{
"_id" : ObjectId("623ec4d0f742a6c9a8ca3bb2"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 110
}
>
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("623e7e888daf7d2fb0e3d27a"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 110
}
{
"_id" : ObjectId("623ec4d0f742a6c9a8ca3bb2"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 110
}
>