mongoDB的CRUD
mongo的连接
可以通过部署图形化控制台,mongodb compass来实现连接,也可以通过shell控制台来连接
# 连接命令(4.几版本)
mongo --host=127.0.0.1 --port=27017 or
# 7.几版本
mongosh
moogo的数据库操作
# 展示数据库
show dbsshow databases# 创建/选择数据库
# 有则切换,无则创建
use mydb # 此时执行show dbs 命令还是看不到mydb,因为此时没数据,还没持久化到磁盘。# 查看当前正在使用的db
db# 删除,切换到要删除的数据库,直接执行如下命令,主要用来删除已经持久化的数据库
db.dropDatabase()
mongo集合(cocollection 相当于mysql中的表)的操作
集合的创建/删除
# 显示创建
db.createCollection(name)# 查看当前库中的表:show tables命令
show tables
or
show collections############################ 删除
db.collection.drop()
文档的操作(数据,对应mysql的行)
插入
db.collection.insert()
# 单文档插入 insert
db.comment.insert({"articleid": "100000","content": "今天天气真好,阳光明媚","userid": "1001","nickname": "Rose","createdatetime": new Date(), "likenum": NumberInt(10), "state": null
})###################################################1)comment集合如果不存在,则会隐式创建
2)mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字),否则取出来就有问题了。
3)插入当前日期使用 new Date()
4)插入的数据没有指定_id,会自动生成主键值
5)如果某字段没值,可以赋值为null,或不写该字段。
################################################################ 多文档插入 insertManydb.comment.insertMany([{"_id": "1","articleid": "100001","content": "我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。","userid": "1002","nickname": "相忘于江湖","createdatetime": ISODate("2019-08-05T22:08:15.522Z"),"likenum": NumberInt(1000),"state": "1"},{"_id": "2","articleid": "100001","content": "我夏天空腹喝凉开水,冬天喝温开水","userid": "1005","nickname": "伊人憔悴","createdatetime": ISODate("2019-08-05T23:58:51.485Z"),"likenum": NumberInt(888),"state": "1"},{"_id": "3","articleid": "100001","content": "我一直喝凉开水,冬天夏天都喝。","userid": "1004","nickname": "杰克船长","createdatetime": ISODate("2019-08-06T01:05:06.321Z"),"likenum": NumberInt(666),"state": "1"},{"_id": "4","articleid": "100001","content": "专家说不能空腹吃饭,影响健康。","userid": "1003","nickname": "凯","createdatetime": ISODate("2019-08-06T08:18:35.288Z"),"likenum": NumberInt(2000),"state": "1"},{"_id": "5","articleid": "100001","content": "研究表明,刚烧开的水千万不能喝,因为烫嘴。","userid": "1003","nickname": "凯撒","createdatetime": ISODate("2019-08-06T11:01:02.521Z"),"likenum": NumberInt(3000),"state": "1"}
]);
如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
因为批量插入由于数据较多容易出现失败,因此,可以使用try catch进行异常捕捉处理
try {db.comment.insertMany([{"_id": "1","articleid": "100001","content": "我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。","userid": "1002","nickname": "相忘于江湖","createdatetime": ISODate("2019-08-05T22:08:15.522Z"),"likenum": NumberInt(1000),"state": "1"},{"_id": "2","articleid": "100001","content": "我夏天空腹喝凉开水,冬天喝温开水","userid": "1005","nickname": "伊人憔悴","createdatetime": ISODate("2019-08-05T23:58:51.485Z"),"likenum": NumberInt(888),"state": "1"},{"_id": "3","articleid": "100001","content": "我一直喝凉开水,冬天夏天都喝。","userid": "1004","nickname": "杰克船长","createdatetime": ISODate("2019-08-06T01:05:06.321Z"),"likenum": NumberInt(666),"state": "1"},{"_id": "4","articleid": "100001","content": "专家说不能空腹吃饭,影响健康。","userid": "1003","nickname": "凯","createdatetime": ISODate("2019-08-06T08:18:35.288Z"),"likenum": NumberInt(2000),"state": "1"},{"_id": "5","articleid": "100001","content": "研究表明,刚烧开的水千万不能喝,因为烫嘴。","userid": "1003","nickname": "凯撒","createdatetime": ISODate("2019-08-06T11:01:02.521Z"),"likenum": NumberInt(3000),"state": "1"}]);
} catch (e) {print(e);
}
修改
db.collection.update(query, update, options)
# 覆盖的修改
#如果我们想修改_id为1的记录,点赞量为1001
db.comment.update({_id:"1"},{likenum:NumberInt(1001)})# 执行后,我们会发现,这条文档除了likenum字段其它字段都不见了#局部修改 $set
#我们想修改_id为2的记录,浏览量为889,输入以下语句
db.comment.update({_id:"2"},{$set:{likenum:NumberInt(889)}})#批量的修改
#更新所有用户为 1003的用户的昵称为 凯撒大帝 。
//默认只修改第一条数据
db.comment.update({userid:"1003"},{$set:{nickname:"凯撒2"}})
//修改所有符合条件的数据
db.comment.update({userid:"1003"},{$set:{nickname:"凯撒大帝"}},{multi:true})
删除
db.集合名称.remove(条件)
# 删除所有
db.comment.remove({})# 删除id为1的
db.comment.remove({_id:"1"})
查询
基本查询
db.collection.find(<query>, [projection])
# 查询所有
db.comment.find()
db.comment.find({})# 查询userid为1003
db.comment.find({userid:"1003"})# 查询一条,findOne()
# 查询用户编号是1003的记录,但只最多返回符合条件的第一条
db.comment.findOne(userid:"1003"}
投影查询
如果要查询结果返回部分字段,则需要使用投影查询
# 查询结果只显示_id、userid、nickname
db.comment.find({userid:"1003"},{userid:1,nickname:1})# 默认_id会显示# 查询结果只显示、userid、nickname,不显示_id
db.comment.find({userid:"1003"},{userid:1,nickname:1,_id:0})# 查询所有数据,但只显示_id、userid、nickname:
db.comment.find({},{userid:1,nickname:1})
分页查询
统计查询--count()
db.collection.count(query, options)
# 统计comment集合的所有的记录数
db.comment.count()# 统计userid为1003的记录条数
db.comment.count({userid:"1003"})
分页列表查询--limit(),skip()
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
# 返回指定条数的记录,可以在find方法后调用limit来返回结果(TopN),默认值20
# 返回前三条
db.comment.find().limit(3)
# skip方法同样接受一个数字参数作为跳过的记录条数。(前N个不要),默认值是0
# 跳过前三条
db.comment.find().skip(3)#######################################
# 需求:每页2个,第二页开始:跳过前两条数据,接着值显示3和4条数据
# 第一页
db.comment.find().skip(0).limit(2)
# 第二页
db.comment.find().skip(2).limit(2)
# 第三页
db.comment.find().skip(4).limit(2)
排序查询-- sort()
db.COLLECTION_NAME.find().sort({KEY:1})
其中1为升序,-1为降序
# 对userid降序排列,并对访问量进行升序排列
db.comment.find().sort({userid:-1,likenum:1})
skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关。
正则查询
支持js的正则表达式
db.collection.find({field:/正则表达式/})
# 我要查询评论内容包含“开水”的所有文档
db.comment.find({content:/开水/})# 如果要查询评论的内容中以“专家”开头的
db.comment.find({content:/^专家/})
比较查询
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)}})
包含查询--$in
# 示例:查询评论的集合中userid字段包含1003或1004的文档
db.comment.find({userid:{$in:["1003","1004"]}})###. 不包含使用$nin操作符。 #### 示例:查询评论集合中userid字段不包含1003和1004的文档
db.comment.find({userid:{$nin:["1003","1004"]}})
条件连接查询--and,or
$and:[ { },{ },{ } ]
$or:[ { },{ },{ } ]
# 查询评论集合中likenum大于等于700 并且小于2000的文档:db.commnet.find({$and:[{likenum:{$gte:NumberInt(700)}},{}likenum:{$lt:{NumberInt(2000)}}]})# 查询评论集合中userid为1003,或者点赞数小于1000的文档记录db.comment.find({$or:[{userid:"1003"},{likenum:{$lt:{NumberInt(1000)}}}]})