MongoDB从入门到放弃(二)

三、基本常用命令

3.1 选择和创建数据库

--选择数据库,如果数据库不存在会自动创建
--use后,一开始是在内存中的,并没有持久化到磁盘, 当有一个集合后会持久化
use 数据库名称(全部小写,最长64字节)
--查看有权限查看的所有数据库,没有集合的数据库不会显示,还在内存中
show dbs
--查看正在使用的数据库
db
  • MongoDB中,集合只有在第一条数据插入后才会创建
  • 默认数据库为test,如果没有选择数据库,集合都会存放到test数据库中

保留数据库:

  • admin:root数据库,一些特定的服务器端命令只能从这个数据库运行,比如:列出所有的数据库或关闭服务器
  • local:这个数据库中的数据永远不会被复制,可以用来存储仅限于本地单台服务器的任意集合。 比如集群环境中,有的数据我们不希望被复制到别的服务器
  • config:当MongoDB用于分片设置时,config数据库在内部使用,用于保存分片的相关信息

3.2 删除数据库

-- 用于删除已经持久化的数据库
db.dropDatabase()

3.3 集合操作

3.3.1 集合的显示创建(了解)

db.createCollection("collection_name")
-- 查看当前库中的集合
show collections / show tables
-- 集合删除
db.collection_name.dorp()

3.3.2 集合的隐式创建

当向集合中插入一个文档的时候,如果集合不存在,则会自动创建。
TODO 自动创建如何保证线程安全????
通常项目中我们使用隐式创建

3.4 文档CRUD

3.4.1 插入:

insert() / save() / insertMany

// 单条插入
db.collection_name.insert(
    <document or array of documents>,
    {
        writeConcern: <document>,
        ordered: <boolean>
    }
)

// 例子
// mongodb中数字默认是double,如果要存整型,必须使用函数NumberInt(),否则取出来出错
// 使用当前日期,可以使用new Date()
// _id会自动生成
db.tangye_test_tb1.insert({"userId":"123", "num":NumberInt(10),"createDateTime":new Date(), "state":null})

// 批量插入
db.collection.insertMany(
    [ <document 1> , <document 2>, ... ], 
    { writeConcern: <document>, ordered: <boolean> }
)
// 例子
db.comment.insertMany([{
    "_id": "1",
    "articleid": "100001",
    "content": "我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我 他。",
    "userid": "1002",
    "nickname": "相忘于江湖",
    "createdatetime": new Date("2019-08- 05T22:08:15.522Z"),
    "likenum": NumberInt(1000),
    "state": "1"
},
{
    "_id": "2",
    "articleid": "100001",
    "content": "我夏天空腹喝凉开水,冬天喝温开水",
    "userid": "1005",
    "nickname": "伊人憔 悴",
    "createdatetime": new Date("2019-08-05T23:58:51.485Z"),
    "likenum": NumberInt(888),
    "state": "1"
}]);
  • 插入时指定了 _id ,则主键就是该值。
  • 如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
  • 因为批量插入由于数据较多容易出现失败,因此,可以使用try catch进行异常捕捉处理,测试的时候可以不处理
ParameterTypeDescription
documentdocument or array要插入到集合中的文档或文档数组(json格式)
writeConcerndocument性能和可靠性级别 PS:通常不指定
orderedboolean可选,插入的数组是有序的还是无序的。
true:按顺序插入数组中的文档,如果其中一个文档出现错误,将返回而不处理数组中的其余文档;
false:则执行无序插入,如果其中一个文档出现错误,则继续处理数组中的文档。 版本2.6+中默认为true PS:通常默认即可,不指定

3.4.2 文档查询

ParameterTypeDescription
querydocument可选。使用查询运算符指定选择筛选器。若要返回集合中的所有文档,可忽略该参数或传递({})
projectiondocument可选。指定要在与查询筛选器匹配的文档中返回的字段。若要返回匹配文档中的所有字段,请省略该参数
db.collection_name.find(<query>,[projection])
// 1. 查询集合中所有文档
db.tangye_test_tb1.find() / db.tangye_test_tb1.find({})

// 2. 指定查询条件
db.tangye_test_tb1.find({"_id":ObjectId("xxxxxxx"), "name":"tangye"})

// 3. 查询后只返回一条数据
db.comment.findOne({userid:'1003'})

// 4. 投影查询 如果要查询结果返回部分字段,则需要使用投影查询
// 查询结果只显示 、userid、nickname ,不显示 _id
db.comment.find({userid:"1003"},{userid:1,nickname:1,_id:0})

// 5. 统计查询 
// query	document	查询选择条件。
// options	document	可选(通常不用)。用于修改计数的额外选项
db.collection.count(query, options)
// 统计comment集合的所有的记录数
db.comment.count()
// 统计userid为1003的记录条数
db.comment.count({userid:"1003"})

// 6. 分页查询 
// 可以使用limit()方法来读取指定数量的数据
// 使用skip()方法来跳过指定数量的数据
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
// 返回指定条数的记录,在find方法后调用limit来返回结果(TopN),默认值20
db.comment.find().limit(3)
// 跳过前N条记录。(前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)

// 7. 排序查询
// sort方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式
// 其中 1 为升序排列,而 -1 是用于降序排列
// ** skip, limilt, sort三个放在一起执行的时候:
//    执行的顺序是先sort, 然后是skip,最后是显示的limit,和命令编写顺序无关
// 对userid降序排列,并对访问量进行升序排列
db.comment.find().sort({userid:-1,likenum:1})

// 8. 正则查询
// MongoDB的模糊查询是通过正则表达式的方式实现的
// 正则表达式是js的语法,直接量的写法
db.collection.find({field:/正则表达式/})
// 查询评论内容包含“开水”的所有文档
db.comment.find({content:/开水/})
// 查询评论的内容中以“专家”开头的
db.comment.find({content:/^专家/})

// 9.比较查询
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)}})

// 10.包含查询
// 查询评论的集合中userid字段 包含 1003或1004的文档
db.comment.find({userid:{$in:["1003","1004"]}})
// 查询评论集合中userid字段 不包含 1003和1004的文档
db.comment.find({userid:{$nin:["1003","1004"]}})

// 11.条件连接查询 
// $and:[ { },{ },{ } ] 
// 查询评论集合中likenum大于等于700 并且 小于2000的文档
db.comment.find({ $and:[ { likenum:{$gte:NumberInt(700)} },{ likenum:{$lt:NumberInt(2000)} } ] })
// $or:[ { },{ },{ } ]
// 查询评论集合中userid为1003,或者点赞数小于1000的文档记录
db.comment.find({$or:[ {userid:"1003"} ,{likenum:{$lt:1000} }]})

3.4.3 文档修改

// update 用于更新已存在的文档
// upsert:可选,如果不存在update的记录,是否插入,true为插入,默认是false,不插入
// multi: 可选,默认是false,只更新找到的第一条记录,true:把按条件查出来多条记录全部更新
// writeConcern :可选,抛出异常的级别
db.collection.update(query, update, options) 
或 
db.collection.update( 
    <query>, 
    <update>, 
    { 
        upsert: <boolean>, 
        multi: <boolean>, 
        writeConcern: <document>, 
        collation: <document>, 
        arrayFilters: [ <filterdocument1>, ... ], 
        hint: <document|string> // Available starting in MongoDB 4.2 
    }
)
或
// save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)
// 覆盖修改
// 修改_id为1的记录,点赞量为1001
// 执行后会发现,这条文档除了likenum字段其它字段都不见了
db.comment.update({_id:"1"},{likenum:NumberInt(1001)})

// 局部修改 使用修改器$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})
// 列值增长的修改
// 对3号数据的点赞数,每次递增1
db.comment.update({_id:"3"},{$inc:{likenum:NumberInt(1)}})

3.4.4 文档删除

db.集合名称.remove(条件)
// 将数据全部删除,请慎用
db.comment.remove({})
// 指定条件删除
db.comment.remove({user_id:"1"})
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值