mongoDB的CRUD

发布于:2025-07-16 ⋅ 阅读:(21) ⋅ 点赞:(0)

mongo的连接

        可以通过部署图形化控制台,mongodb compass来实现连接,也可以通过shell控制台来连接

# 连接命令(4.几版本)
mongo --host=127.0.0.1 --port=27017 

or
# 7.几版本
mongosh 

moogo的数据库操作

# 展示数据库
show dbs

show 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,或不写该字段。
###############################################################

# 多文档插入 insertMany

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"
  }
]);

如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。

因为批量插入由于数据较多容易出现失败,因此,可以使用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)}}}]})


网站公告

今日签到

点亮在社区的每一天
去签到