一,数据库操作
1)选择和创建数据库语法:
use 数据库名
use命令的规则是,如果存在对应的数据库那么就切换,不存在就创建
2)数据库的删除
db.dropDatabase()
3)查看有权限的数据库
show dbs 或者 show databases
注意:当你使用use命令创建了一个新的数据时,使用show dbs是看不到你刚才的数据的,因为show dbs看的是磁盘里的数据库,而你创建的这个数据库还在内存中,只有新创建的数据库有一个集合时才会持久化到磁盘中;
4)查看当前使用的数据库
db
通过shell连接本地MongoDB数据库简单操作
>*******************创建新库,并切换到新库,已存在的库则会直接切换*******************
> use mydb
switched to db mydb
>
>******************显示当前使用的库********************
> db
mydb
>
>*******************删除当前库*******************
> db.dropDatabase()
{ "ok" : 1 }
>
>*******************显示所有的库*******************
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>

二,集合操作
集合就是对应关系型数据的表
1)集合的显示创建(显示创建)
db.createConllection(“集合名”)
2)集合查看
show collections
3)集合删除
db.集合名.drop() 或 db.collection.drop()
举例:
>******************查看当前使用的那个库*******************
> db
mydb
>
>*******************创建集合(mysql的表)*******************
> db.createCollection("myCollection")
{ "ok" : 1 }
>
>*******************查询当前库下所有的集合*******************
> show collections
myCollection
>
>*******************删除集合*******************
> db.myCollection.drop()
true
4)集合隐式创建就是创建文档是没有对应的集合,系统自动创建
三,文档的基本CRUD
文档就是关系型数据一条一条的数据,只是mongodb的文档数据结构和JSON基本一致;
1),文档的插入
单个文档插入:
db.myCollection.insert(要插入的数据) 或 db.myCollection.save(要插入的数据)
批量文档插入:
db.myCollection.insertMany([ 要插入的数据,要插入的数据,要插入的数据 . . . . . . ])
注意:批量插入时出现异常,后面的数据不会再执行,而前面已插入成功的不会回滚;
try{}catch{}来输出异常
try{ 插入语句 }catch(e){ print(e); }
文档查询:
db.集合名.find() 或 db.集合名.find({你要查询的条件})
举例:
>*******************插入一条数据*******************
> db.myCollection.insert({"_id":"1","name":"张三","age":NumberInt(10),"time":new Date()})
WriteResult({ "nInserted" : 1 })
>
> db.myCollection.find()
{ "_id" : "1", "name" : "张三", "age" : 10, "time" : ISODate("2021-12-04T11:51:59.724Z") }
>
>******************批量插入多条数据*******************
> db.myCollection.insertMany([{"_id":"2","name":"张三","age":NumberInt(10),"time":new Date()},{"_id":"3","name":"张三","age":NumberInt(10),"time":new Date()}])
{ "acknowledged" : true, "insertedIds" : [ "2", "3" ] }
>
> db.myCollection.find()
{ "_id" : "1", "name" : "张三", "age" : 10, "time" : ISODate("2021-12-04T11:51:59.724Z") }
{ "_id" : "2", "name" : "张三", "age" : 10, "time" : ISODate("2021-12-04T11:53:53.746Z") }
{ "_id" : "3", "name" : "张三", "age" : 10, "time" : ISODate("2021-12-04T11:53:53.746Z") }
>
2),文档的查询
查询某个集合所有的数据:
db.集合名.find()
根据条件查询:
db.集合名.find({你要查询的条件})
根据条件查询一条类似于mysql的limit 1 :
db.集合名.findOne({你要查询的条件}) 或 db.集合名.findOne()
投影查询,查询想要展示的参数
db.集合名.findOne({你要查询的条件},{要展示的字段:1,不想展示id:0})
> db.myCollection.find()
{ "_id" : "1", "name" : "张三", "age" : 10, "time" : ISODate("2021-12-04T11:51:59.724Z") }
{ "_id" : "2", "name" : "张三", "age" : 10, "time" : ISODate("2021-12-04T11:53:53.746Z") }
{ "_id" : "3", "name" : "张三", "age" : 10, "time" : ISODate("2021-12-04T11:53:53.746Z") }
{ "_id" : "5", "name" : "张三", "age" : 10, "time" : ISODate("2021-12-04T12:12:30.737Z") }
{ "_id" : "6", "name" : "李四", "age" : 10, "time" : ISODate("2021-12-04T12:12:30.737Z") }
>
>*******************查名字为李四的数据*******************
> db.myCollection.find({"name":"李四"})
{ "_id" : "6", "name" : "李四", "age" : 10, "time" : ISODate("2021-12-04T12:12:30.737Z") }
>
>*******************查名字为李四的数据但是只展示name字段id字段默认会展示*******************
> db.myCollection.find({"name":"李四"},{"name":1}))
{ "_id" : "6", "name" : "李四" }
>*******************查名字为李四的数据,只展示名字,id也不展示*******************
> db.myCollection.find({"name":"李四"},{"name":1,"_id":0})
{ "name" : "李四" }
>
更多复杂查询操作看下面的第 5)6)节;
3),文档的更新
覆盖文档更新
db.集合名.update({更新条件},{更新的内容})
注意:这样更新会将之前字段全部都替换掉,自剩下你更新的内容
局部修改
db.集合名.update({更新条件},{$set:{更新的内容}})
注意:如果匹配到多条数据,这样的修改只会修改第一条数据
批量修改
db.集合名.update({更新条件},{$set:{更新的内容}},{multi:true})
列值增值
db.集合名.update({更新条件},{$inc:{更新的内容}})
举例:
> db.myCollection.find()
{ "_id" : "1", "name" : "张三", "age" : 23, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "2", "name" : "李四", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "3", "name" : "王五", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "4", "name" : "赵六", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
>
>*******************覆盖修改id为1的这条数据将会被替换为{“age”:27}*******************
> db.myCollection.update({_id:"1"},{"age":NumberInt(27)}))
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>
> db.myCollection.find()
{ "_id" : "1", "age" : 27 }
{ "_id" : "2", "name" : "李四", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "3", "name" : "王五", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "4", "name" : "赵六", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
>
>*******************修改id等于2这条数据的年龄为33(如果匹配到多条也只会修改第一条)*******************
> db.myCollection.update({"_id":"2"},{$set:{"age":NumberInt(33)}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>
>
> db.myCollection.find()
{ "_id" : "1", "age" : 27 }
{ "_id" : "2", "name" : "李四", "age" : 33, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "3", "name" : "王五", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "4", "name" : "赵六", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
>
>*******************修改年龄为10的数据的名字为凯撒大帝(批量修改)*******************
> db.myCollection.update({"age":10},{$set:{"name":"凯撒大帝"}},{multi:true})))
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
>
> db.myCollection.find()
{ "_id" : "1", "age" : 27 }
{ "_id" : "2", "name" : "李四", "age" : 33, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "3", "name" : "凯撒大帝", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "4", "name" : "凯撒大帝", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
>
>*******************给id为1这条数据的年龄加2*******************
> db.myCollection.update({"_id":"1"},{$inc:{"age":NumberInt(2)}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>
> db.myCollection.find()
{ "_id" : "1", "age" : 29 }
{ "_id" : "2", "name" : "李四", "age" : 33, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "3", "name" : "凯撒大帝", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "4", "name" : "凯撒大帝", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
>
4),文档的删除
根据条件删除
db.集合名.remove(条件) 或 db.集合名.deleteMany(条件)
删除集合下所有数据
db.集合名.remove({})
举例
> db.myCollection.find()
{ "_id" : "2", "name" : "李四", "age" : 33, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "3", "name" : "凯撒大帝", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "4", "name" : "凯撒大帝", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "1", "age" : 29 }
{ "_id" : "5", "age" : 29 }
>
>*******************删除年龄为29的数据*******************
> db.myCollection.remove({"age":29})
WriteResult({ "nRemoved" : 2 })
>
> db.myCollection.find()
{ "_id" : "2", "name" : "李四", "age" : 33, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "3", "name" : "凯撒大帝", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
{ "_id" : "4", "name" : "凯撒大帝", "age" : 10, "time" : ISODate("2021-12-05T04:18:54.868Z") }
>
>*******************删除指定集合所有的数据*******************
> db.myCollection.remove({})
WriteResult({ "nRemoved" : 3 })
>
>
>db.myCollection.find()
>
5)文档的分页查询
统计查询
db.集合名.count(条件没有条件统计所有)
返回指定的记录数
db.集合名.find().limit(数字)
跳过指定的数据得到指定之后的数据
db.集合名.find().skip(数字)
分页查询,就是limit()和skip()配合使用
db.集合名.find().limit(页容量).skip(查询的起始位置=(当前页-1)*页容量)
排序查询
db.集合名.find().sort(条件:-1) ; -1的话就是降序 1就是升序,可同时支持多个条件排序
举例:
>
> db.myCollection.find()
{ "_id" : "1", "name" : "张三", "age" : 23, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "2", "name" : "李四", "age" : 43, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "3", "name" : "王五", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "4", "name" : "赵六", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "5", "name" : "田七", "age" : 9, "time" : ISODate("2021-12-05T05:10:29.313Z") }
>
>*******************统计指定集合的所有数据总量*******************
> db.myCollection.count()
5
>*******************统计年龄等于10的数据*******************
> db.myCollection.count({"age":10})
2
>*******************跳过前三条数据的数据*******************
> db.myCollection.find().skip(3)
{ "_id" : "4", "name" : "赵六", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "5", "name" : "田七", "age" : 9, "time" : ISODate("2021-12-05T05:10:29.313Z") }
>
>*******************分页查询*******************
> db.myCollection.find().limit(2).skip(0)
{ "_id" : "1", "name" : "张三", "age" : 23, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "2", "name" : "李四", "age" : 43, "time" : ISODate("2021-12-05T05:10:29.313Z") }
>
> db.myCollection.find().limit(2).skip(2)
{ "_id" : "3", "name" : "王五", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "4", "name" : "赵六", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
> db.myCollection.find().limit(2).skip(4)
{ "_id" : "5", "name" : "田七", "age" : 9, "time" : ISODate("2021-12-05T05:10:29.313Z") }
>
>******************按按年龄降序,然后按id升序的数据*******************
> db.myCollection.find().sort({age:-1},{_id:1})
{ "_id" : "2", "name" : "李四", "age" : 43, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "1", "name" : "张三", "age" : 23, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "3", "name" : "王五", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "4", "name" : "赵六", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "5", "name" : "田七", "age" : 9, "time" : ISODate("2021-12-05T05:10:29.313Z") }
>
6)复杂查询
mongo的查询支持正则
模糊查询
db.集合名.find({name:/张/})
查询以指定字段开头的数据
db.myCollection.find({name:/^王/}))
范围查询
<,<=, >,>=这个操作符也是很常用的,格式如下:
db . 集 合 名 称 . find ( { “field”{ $gt: value }}) // 大于:field > value
db. 集 合 名 称 . find ( {“field” { $lt: value }}) // 小于:field < value
db. 集合 名 称 . find ( { “field”{ $gte: value }}) // 大于等于:field >= value
db .集 合 名 称 . find ( { “field”{ $lte: value }}) // 小于等于:field <= value
db .集合名称.find({ “field”( { $ne: value }}) // 不等于:field != value示例:查询评论点缴量大于700的记录
db . comment.find({likenum:{$gt:NumberInt(700)}})
包含不包含查询
db.集合名.find({age:{$in:[23,9]}}) 包含年龄为23和9的
db.集合名.find({age:{$nin:[23,9]}}) 不包含年龄为23和9的
条件查询and和or

举例:
> db.myCollection.find()
{ "_id" : "1", "name" : "张三", "age" : 23, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "2", "name" : "李四", "age" : 43, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "3", "name" : "王五", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "4", "name" : "赵六", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "5", "name" : "田七", "age" : 9, "time" : ISODate("2021-12-05T05:10:29.313Z") }
>
>
>*******************模糊查询带名字带张的数据*******************
> db.myCollection.find({name:/张/})
{ "_id" : "1", "name" : "张三", "age" : 23, "time" : ISODate("2021-12-05T05:10:29.313Z") }
> db.myCollection.find({name:/^王/}))
{ "_id" : "3", "name" : "王五", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
>
>*******************查询年龄大于10的数据*******************
> db.myCollection.find({"age":{$gt:10}})
{ "_id" : "1", "name" : "张三", "age" : 23, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "2", "name" : "李四", "age" : 43, "time" : ISODate("2021-12-05T05:10:29.313Z") }
>
>*******************查询年龄不包含23,9的数据*******************
> db.myCollection.find({age:{$nin:[23,9]}})
{ "_id" : "2", "name" : "李四", "age" : 43, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "3", "name" : "王五", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "4", "name" : "赵六", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
>
>*******************查询年龄包含23,9的数据*******************
> db.myCollection.find({age:{$in:[23,9]}})
{ "_id" : "1", "name" : "张三", "age" : 23, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "5", "name" : "田七", "age" : 9, "time" : ISODate("2021-12-05T05:10:29.313Z") }
>
>
>*******************查询年龄大于9且小于40的数据*******************
> db.myCollection.find({$and:[{"age":{$gt:9}},{"age":{$lt:40}}]})
{ "_id" : "1", "name" : "张三", "age" : 23, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "3", "name" : "王五", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
{ "_id" : "4", "name" : "赵六", "age" : 10, "time" : ISODate("2021-12-05T05:10:29.313Z") }
>
总结:

215

被折叠的 条评论
为什么被折叠?



