MongoDB数据库的基本操作
一、数据库与集合的操作
1、数据库的操作
(1)操作语法
# 创建数据库
use DATABASE_NAME
# 删除数据库
db.dropDatabase()
(2)操作案例
#刚创建的库并不存在于表中,只有插入数据时才会在表中显示
> use test123
switched to db test123
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> db.test123.insert({"test":"test123"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test123 0.000GB
# 删除数据库
> use test123
switched to db test123
> db.dropDatabase()
{ "dropped" : "test123", "ok" : 1 }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
2、集合的操作
(1)集合的操作语法
# 创建集合
db.createCollection(name, options)
# 创建集合时options为可选参数,主要有以下参数
# capped: 如果为true则创建固定集合,固定集合是指有固定大小的集合,当达到最大值时会自动覆盖最早的文档,当该值为true时,必须指定size参数
# size: 为固定集合指定一个最大值,即字节数
# max: 指定固定集合中包含文档的最大数值
# 删除集合
db.collection.drop()
# 查看集合
show collections
(2)集合的操作案例
# 在库dayi123中创建集合test
> use dayi123
switched to db dayi123
> db.createCollection("test")
{ "ok" : 1 }
# 创建集合时指定参数
> db.createCollection("mytest",{ capped : true, size : 6142800, max : 10000})
{ "ok" : 1 }
# 在插入文档时也会自动创建集合
> db.mytest2.insert({"test" : "test123"})
WriteResult({ "nInserted" : 1 })
# 删除集合
> use dayi123
switched to db dayi123
> db.mytest2.drop()
true
> show collections
mytest
test
3、对文档的操作
(1)插入文档
1)插入文档语法
# 语法格式
db.COLLECTION_NAME.insert(document) # 在该方法中若插入的数据主键已经存在,则会抛org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据
db.COLLECTION_NAME.save(document) # 如果 _id 主键存在则更新数据,如果不存在就插入数据。
# db.collection.insertOne() 用于向集合插入一个新文档,语法格式如下:
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
# db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:参数说明如下:
# document:要写入的文档
# writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
# ordered:指定是否按顺序写入,默认 true,按顺序写入。
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
2)操作示例
# 通过db.COLLECTION_NAME.insert方法插入数据
> db.mytest.insert({title: '测试插入第一条数据',
... description: 'MongoDB 是一个 Nosql 数据库',
... by: 'test01',
... tags: ['mongodb', 'database', 'NoSQL'],
... likes: 100
... })
WriteResult({ "nInserted" : 1 })
# 通过db.col.insert方法将数据定义为一个变量进行插入
> data=({title: '测试插入第二条数据',
... description: 'MongoDB 是一个 Nosql 数据库',
... by: 'test01',
... tags: ['mongodb', 'database', 'NoSQL'],
... likes: 100
... })
{
"title" : "测试插入第二条数据",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "test01",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
> db.mytest.insert(data)
WriteResult({ "nInserted" : 1 })
# 查看插入的数据
> db.mytest.find()
{ "_id" : ObjectId("60edbdd42e921da517218631"), "title" : "测试插入第一条数据", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "test01", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("60edbe4f2e921da517218632"), "title" : "测试插入第二条数据", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "test01", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
> db.mytest.insertOne({"a1" : 1})
{
"acknowledged" : true,
"insertedId" : ObjectId("60edbf4e2e921da517218633")
}
# 通过db.collection.insertOne()插入一条数据
> db.mytest.insertOne({"a1" : 1})
{
"acknowledged" : true,
"insertedId" : ObjectId("60edbf4e2e921da517218633")
}
# 通过db.collection.insertOne()插入多条数据
> db.mytest.insertMany([{"a2": 2},{"a3": 3}])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("60edbf9c2e921da517218634"),
ObjectId("60edbf9c2e921da517218635")
]
}
# 通过数组的方式插入多条数据
> var arr = [];
> for(var i=1 ; i<=50 ; i++){
... arr.push({num:i});
... }
50
> db.mytest.insert(arr);
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 50,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
(2)更新文档
1)语法
# 更新文档语法
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 :可选,抛出异常的级别。
# 也可通过save方法更新
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
# 参数说明:
# document : 文档数据。
# writeConcern :可选,抛出异常的级别
2)示例
# 更新匹配到的第一条数据
> db.mytest.update({"title" : "测试插入第一条数据"},{$set:{"title" : "更新的第一条数据"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.mytest.find()
{ "_id" : ObjectId("60edbdd42e921da517218631"), "title" : "更新的第一条数据", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "test01", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
# 你要修改多条相同的文档,则需要设置 multi 参数为 true。
db.mytest.update({"description" : "MongoDB 是一个 Nosql 数据库"},{$set:{"description" : "mongodb is nosql"}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
# 通过save的方法更新
> db.mytest.save({
... "_id" : ObjectId("60edbdd42e921da517218631"),
... "title" : "第一条数据",
... "description" : "mongodb is nosql",
... "by" : "test01",
... "tags" : [
... "mongodb",
... "database",
... "NoSQL"
... ],
... "likes" : 100
... })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.mytest.find().pretty()
{
"_id" : ObjectId("60edbdd42e921da517218631"),
"title" : "第一条数据",
"description" : "mongodb is nosql",
"by" : "test01",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
(3)删除文档
1)语法
# 删除文档语法
db.collection.remove(
<query>,
<justOne>
)
# 参数说明
# query : (可选)删除的文档的条件。
# justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
# 删除满足条件的所所有文档
db.inventory.deleteMany()
# 删除满足条件的第一个文档
db.inventory.deleteOne()
2)示例
# 删除匹配到的所有文档
> db.mytest.remove({"title" : "第一条数据"})
WriteResult({ "nRemoved" : 1 })
# 删除满足条件的所有文档
> db.mytest.deleteMany({"a1" : 1})
{ "acknowledged" : true, "deletedCount" : 1 }
# 删除满足条件的第一个文档
> db.mytest.deleteOne({"num" : 1})
{ "acknowledged" : true, "deletedCount" : 1 }
# 删除集合下的所有文档
> db.mytest.deleteMany({})
{ "acknowledged" : true, "deletedCount" : 52 }
(4)查询
1)mongodb中条件操作符
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
- 查询语法
# 基本查询语法
db.collection.find(query, projection)
# 参数说明:
# query :可选,使用查询操作符指定查询条件
# projection :可选,使用投影操作符指定返回的键。默认省略返回所有值
# 如果需要以易读的方式来读取数据,可以使用 pretty() 方法
# 还有一个 findOne() 方法,它只返回一个文档。
# 使用AND方法查询语法
db.col.find({key1:value1, key2:value2}).pretty()
# 使用OR方法的查询语法
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
3)查询示例
# 通过AND条件查询同时满足title和likes的数据
> db.mytest.find({"title" : "测试插入第一条数据","likes" : 100})
{ "_id" : ObjectId("60ede3712e921da517218668"), "title" : "测试插入第一条数据", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "test01", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
# 通过or条件查询满足title或likes的数据
> db.mytest.find({$or:[{"title" : "测试插入第一条数据"},{"likes" : 200}]})
{ "_id" : ObjectId("60ede3712e921da517218668"), "title" : "测试插入第一条数据", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "test01", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("60ede3c22e921da51721866c"), "title" : "测试插入第五条数据", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "test01", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 200 }
# AND条件和or条件的联合使用
> db.mytest.find({"likes": {$gt:103}, $or: [{"title" : "测试插入第一条数据"},{"title" : "测试插入第四条数据"}]})
{ "_id" : ObjectId("60ede3ad2e921da51721866b"), "title" : "测试插入第四条数据", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "test01", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 104 }