MongoDB 入门命令

查看当前数据库

  1. > show dbs
  2. admin 0.000GB
  3. config 0.000GB
  4. local 0.000GB
  5. >
  6.  
  7. -- use databaseName 选库
  8. > use test
  9. switched to db test
  10. >
  11.  
  12. -- show tables/collections 查看当前库下的collection
  13. > show tables
  14. > show collections
  15. >

基础操作

Mongodb的库是隐式创建,你可以use 一个不存在的库然后在该库下创建collection,即可创建库

  1. --创建collection
  2. --db.createCollection(‘collectionName’)
  3.  
  4. > db.createCollection('test')
  5. { "ok" : 1 }
  6. >
  7. > show tables
  8. test
  9. >
  10.  
  11. --collection允许隐式创建
  12. --Db.collectionName.insert(document);
  13. > db.stu.insert({stu:'001',name:'xiaoming'})
  14. WriteResult({ "nInserted" : 1 })
  15. > show tables
  16. stu
  17. test
  18.  
  19. -- 删除collection
  20. db.collectionName.drop()
  21.  
  22. -- 删除database
  23. db.dropDatabase();
  24. > db.dropDatabase()
  25. { "dropped" : "test", "ok" : 1 }
  26. >

插入数据

  1. > db.stu.insert({sid:"10"})
  2. WriteResult({ "nInserted" : 1 })
  3. > db.stu.insert({sid:"11"})
  4. WriteResult({ "nInserted" : 1 })
  1. > db.stu.find()
  2. { "_id" : ObjectId("5c0c8a0b31a9b3cbb9df1d4f"), "sid" : "10" }
  3. { "_id" : ObjectId("5c0c8ac731a9b3cbb9df1d50"), "sid" : "11" }

添加数据时不添加任何主键,会制动生成一个主键,主键不会像关系型数据库那样自动递增(为了分布式考虑),使用的是时间戳+机器编号+进程编号+序列号来生成,保证每个id都是唯一的.id为5c0c8a0b31a9b3cbb9df1d4f,可以分解为
5c0c8a0b 31a9b3 cbb9 df1d4f (5c0c8a0b)表示时间戳, 31a9b3 表示机器号, cbb9 表示进程编号, df1d4f 表示序列号

我们也可以手动指定ID

  1. > db.stu.insert({_id:"001","sid":"12"})
  2. WriteResult({ "nInserted" : 1 })
  3. > db.stu.find()
  4. { "_id" : ObjectId("5c0c8a0b31a9b3cbb9df1d4f"), "sid" : "10" }
  5. { "_id" : ObjectId("5c0c8ac731a9b3cbb9df1d50"), "sid" : "11" }
  6. { "_id" : "001", "sid" : "12" }
  7. >

批量插入

  1. > db.user.insert([
  2. ... {username:"xiaoming",nickname:"XM",passwd:"123"} ,
  3. ... {username:"xiaogang",nickname:"XG",passwd:"111"},
  4. ... {username:"xiaohua",nickname:"XH",passwd:"123"}
  5. ... ])
  6. BulkWriteResult({
  7. "writeErrors" : [ ],
  8. "writeConcernErrors" : [ ],
  9. "nInserted" : 3,
  10. "nUpserted" : 0,
  11. "nMatched" : 0,
  12. "nModified" : 0,
  13. "nRemoved" : 0,
  14. "upserted" : [ ]
  15. })
  16. # 查看数据
  17. > db.user.find().pretty()
  18. {
  19. "_id" : ObjectId("5c0c8f3531a9b3cbb9df1d51"),
  20. "username" : "xiaoming",
  21. "nickname" : "XM",
  22. "passwd" : "123"
  23. }
  24. {
  25. "_id" : ObjectId("5c0c8f3531a9b3cbb9df1d52"),
  26. "username" : "xiaogang",
  27. "nickname" : "XG",
  28. "passwd" : "111"
  29. }
  30. {
  31. "_id" : ObjectId("5c0c8f3531a9b3cbb9df1d53"),
  32. "username" : "xiaohua",
  33. "nickname" : "XH",
  34. "passwd" : "123"
  35. }

执行插入数据的时候,驱动程序会把数据转换成为BSON格式,然后将数据输入数据库,数据库会解析BSON,并检验是否含有“_id”键,因为用户如果没有自定义”_id”,会自动生成,而且每次插入的文档不能超过16M(插入文档的大小跟MongoDB版本有关系)

删除文档

方式一

db.user.deleteMany({})

  1. > db.user.deleteMany({})
  2. { "acknowledged" : true, "deletedCount" : 3 }
  3. >
  4. > db.user.remove({})
  5. WriteResult({ "nRemoved" : 3 })

上述命令会删除user所有的文档,不删除集合本身,原有的索引也会保留,remove函数可以接收一个查询文档作为可选参数给定参数后,可以删除指定符条件的文档。

方式二

  1. > db.user.remove({passwd:"123"})
  2. WriteResult({ "nRemoved" : 2 })
  3. > db.user.find().pretty()
  4. {
  5. "_id" : ObjectId("5c0c91d131a9b3cbb9df1d5b"),
  6. "username" : "xiaogang",
  7. "nickname" : "XG",
  8. "passwd" : "111"
  9. }

删除数据是永久性的不可以撤销也不能恢复。

更新文档

在MongoDB中更新单个文档的操作是原子性的,默认情况下如果一个update操作多个文doc,那么对于每个doc的更新是原子性的,但是对于整个update操作而言,不是原子性的可能存在前面的doc更新成功,而后面的文档更新失败,由于更新单个文档doc的操作是原子性的,如果两个更新同时发生,那么一个更新操作会足协另外一个,doc的最终结果的值是由事件靠后的更新操作删除决定的.

格式

db.collection.update(critera,objNew,upset,multi)

critera:查询条件

objNew:update对象和一些更新操作符

upset:如果存在update记录,是否插入objNew这个新文档,true为插入,默认为false

multi:默认是false,值更新找到的第一条记录,如果是true,按照条件查询出看来的记录全部更新

save

另一个更新命令是save 格式如下

db.collection.save(object)

obj表示要更新的对象,如果内部已经存在一个和obj相同的”_id”的记录纸Mongodb会把obj对象替换集合内已存在的记录,如果不存在,则会插入obj对象.

文档替换

用于一个新文档完全替代匹配的文档,这种方法先把数据读出来,之后对对象的方式完成修改,这种方式一般用在修改较大的情况下:

  1. db.user.insertOne({
  2. name:"foo",
  3. nickname:"bar",
  4. friends:12,
  5. enemies:2
  6. })

我们希望把数据修改成为

  1. db.user.insertOne({
  2. name:"foo",
  3. nickname:"bar",
  4. relations:{
  5. friends:12,
  6. enemies:2
  7. }
  8. })

步骤

查询对象存储到u中:

  1. var u = db.user.findOne({name:"foo"})

设置relations的值:

  1. u.relations = {friends:u.friends,enemies:u.enemies}

修改username的值:

  1. > u.username = u.name
  2. foo

删除friends:

  1. > u.username = u.name
  2. foo

删除enmies:

  1. > delete u.enemies
  2. true

删除name:

  1. delete u.name

替换对象

  1. > db.user.update({name:"foo"},u)
  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

查询

  1. > db.user.find().pretty()
  2. {
  3. "_id" : ObjectId("5c0cab14d22a51c6ef9cdcee"),
  4. "nickname" : "bar",
  5. "relations" : {
  6. "friends" : undefined,
  7. "enemies" : undefined
  8. },
  9. "username" : "foo"
  10. }

这种替换基于编程思想来进行的这种方式对单个对象傅咋修改比较适用

使用修改器

修改文档只修改文章的部分,而不是全部,这个时候我们可以使用修改器对文档进行更新,他的主要思想是通过$符号来进行修改这些操作

增加和减少

inc可以对数据进行增加和减少,这个操作只针对数字类型,小数或者整数.

添加一条数据:

  1. > db.topic.insertOne({title:"first",version:108})
  2. {
  3. "acknowledged" : true,
  4. "insertedId" : ObjectId("5c0cb1ba422725fda4bd5746")
  5. }
  6. > db.topic.find().pretty()
  7. {
  8. "_id" : ObjectId("5c0cb1ba422725fda4bd5746"),
  9. "title" : "first",
  10. "version" : 108
  11. }

将数字减少3

  1. > db.topic.update({"title" : "first"},{$inc:{version:-3}})
  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  3. > db.topic.find().pretty()
  4. {
  5. "_id" : ObjectId("5c0cb1ba422725fda4bd5746"),
  6. "title" : "first",
  7. "version" : 105
  8. }

$set修改器

使用 set 可以完成的顶的需求修改

  1. 原始数据
  2. > db.author.find().pretty()
  3. {
  4. "_id" : ObjectId("5c0cb444422725fda4bd5747"),
  5. "name" : "foo",
  6. "age" : 20,
  7. "gender" : "male",
  8. "intro" : "student"
  9. }

将intro 修改为 teacher

  1. > db.author.update({name:"foo"},{$set:{intro:"teacher"}})
  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  3. > db.author.find().pretty()
  4. {
  5. "_id" : ObjectId("5c0cb444422725fda4bd5747"),
  6. "name" : "foo",
  7. "age" : 20,
  8. "gender" : "male",
  9. "intro" : "teacher"
  10. }
  11. >

$push修改器

使用push可以完成数组的插入,会在最后一条插入,如果没有这个key会自动创建一长条插入

  1. > db.post.find().pretty()
  2. {
  3. "_id" : ObjectId("5c0cc527422725fda4bd5748"),
  4. "title" : "a blog",
  5. "content" : "...",
  6. "author" : "foo"
  7. }
  8. #s使用push插入数组
  9.  
  10. db.post.update({title:"a blog"},{$push:{comments:{name:"lina",email:"lina@email.com",content:"lina replay"}}})
  11. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  12. > db.post.find().pretty()
  13. {
  14. "_id" : ObjectId("5c0cc527422725fda4bd5748"),
  15. "title" : "a blog",
  16. "content" : "...",
  17. "author" : "foo",
  18. "comments" : [
  19. {
  20. "name" : "lina",
  21. "email" : "lina@email.com",
  22. "content" : "lina replay"
  23. }
  24. ]
  25. }

addToSet修改器

使用addToSet可以向一个数组添加元素,有一个限定条件,如果存在了就不添加.

  1. {
  2. "_id" : ObjectId("5c0cc9f3cdb93a655448eec5"),
  3. "name" : "foo",
  4. "age" : 12,
  5. "email" : [
  6. "foo@example.com",
  7. "foo@163.com"
  8. ]
  9. }
  10. ## 添加集合
  11. > db.user.update({name:"foo"},{$addToSet:{email:"foo@qq.com"}})
  12. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  13. 查询结果
  14. > db.user.find().pretty()
  15. {
  16. "_id" : ObjectId("5c0cc9f3cdb93a655448eec5"),
  17. "name" : "foo",
  18. "age" : 12,
  19. "email" : [
  20. "foo@example.com",
  21. "foo@163.com",
  22. "foo@qq.com"
  23. ]
  24. }
  25. >
  26. ## 插入一个存在的数据
  27. > db.user.update({name:"foo"},{$addToSet:{email:"foo@qq.com"}})
  28. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
  29. > db.user.find().pretty()
  30. {
  31. "_id" : ObjectId("5c0cc9f3cdb93a655448eec5"),
  32. "name" : "foo",
  33. "age" : 12,
  34. "email" : [
  35. "foo@example.com",
  36. "foo@163.com",
  37. "foo@qq.com"
  38. ]
  39. }

nModified键的值为 0 ,因为已经添加了,所以执行添加语句的时候不会重复添加的,这种机制减少了数据库的冗余数据.

更新多个文档

  1. > db.clllections.update({x:1},{x:99})
  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  3. > db.clllections.find().pretty()
  4. { "_id" : ObjectId("5c0ccc58cdb93a655448eec6"), "x" : 99 }
  5. { "_id" : ObjectId("5c0ccc61cdb93a655448eec7"), "x" : 1 }
  6. { "_id" : ObjectId("5c0ccc65cdb93a655448eec8"), "x" : 1 }
  7. { "_id" : ObjectId("5c0ccc6acdb93a655448eec9"), "x" : 2 }
  8. >
  9. 只有第一条匹配了 采用如下命令
  10. > db.clllections.update({x:1},{$set:{x:99}},false,true)
  11. WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
  12. > db.clllections.find().pretty()
  13. { "_id" : ObjectId("5c0ccc58cdb93a655448eec6"), "x" : 99 }
  14. { "_id" : ObjectId("5c0ccc61cdb93a655448eec7"), "x" : 99 }
  15. { "_id" : ObjectId("5c0ccc65cdb93a655448eec8"), "x" : 99 }
  16. { "_id" : ObjectId("5c0ccc6acdb93a655448eec9"), "x" : 2 }
  17.  
  18. 首先我们要将修改的数据赋值给$set,$set是一个修改器,我们将在上文详细讲解过,然后后面多了两个参数,第一个flase表示如果不存在update记录,是否将我们要更新的新文档插入,
    true 表示插入 false 表示不插入,第二个true表示是否更新全部属性的文章,false表示值更新第一条记录,true表示更新所有查到的文档.

MongoDB基础命令的更多相关文章

  1. MongoDB基础命令及操作

    MongoDB:NoSQL数据库 MongoDB中的重要指示点 MongoDB中的三要素 数据库 集合 文档 MongoDB中的数据存储是以Bson的形式存储的,Bson是二进制的json,所以看上去 ...

  2. 2、链接数据库+mongodb基础命令行+小demo

    链接数据库并且打印出数据的流程:1.在CMD里面输入 mongod 2.在CMD里面输入 mongo 3.在输入mongodb命令行里面进行操作,首先输入 show dbs 来查看是否能够链接得上库4 ...

  3. MongoDB 基础命令行

    本文专门介绍MongoDB的命令行操作.其实,这些操作在MongoDB官网提供的Quick Reference上都有,但是英文的,为了方便,这里将其稍微整理下,方便查阅. 登录和退出 mongo命令直 ...

  4. MongoDB基础命令笔记

    一.创建数据库 use foobar 二.创建集合 db.persons.insert({name:"zhaomin",age:23}) 三.查找 db.persons.find( ...

  5. MongoDB 基础命令使用学习记录

    1. 启动 mongod 几个常用命令说明:--dbpath : 指定数据库相关文件的存储目录 --logpath: 指定日志文件的存储目录 --port: 指定数据库的端口,默认是 27017 -- ...

  6. MongoDB 基础命令——数据库表的增删改查——遍历操作表中的记录

    分组排序查询最大记录 //对 "catagory" 不等于 null 的数据进行分组查询,且查询结果倒序 db.getCollection('userAccount').aggre ...

  7. MongoDB 基础命令 (MongoDB Shell)

    1.我们 mongodb 安装成功后,用上一篇的方法启动 mongodb服务 然后使用 mongodb shell 来做数据库的增删改查 2.创建数据库 语法: use 数据库名称 案例: > ...

  8. MongoDB 学习笔记一 安装以及基础命令

    一.MongoDB安装配置 1.获取最新版本号: wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.2.tgz 2.解压缩就可 ...

  9. MongoDB 目录分析、基础命令、参数设置

    目录分析 1.整体目录 以msi默认的data.log路径安装,才会有data.log文件夹. 2.bin目录 3.log目录 基础命令 1.服务器端基础命令 net  start  MongoDB  ...

随机推荐

  1. 如何使用百度bae部署web项目

    百度bae提供了支持各种开发环境的的应用引擎,包括node.js.php.java等,而且还免费提供了一定容量的mysql.mongodb.redis等数据库,所以,可以把它当作一个云服务器来使用.而 ...

  2. 自建mail服务器之二:hmailserver

    具体参考: http://blog.xuite.net/sendohshih/blog/41958216-3%E5%88%86%E9%90%98%E8%BC%95%E9%AC%86%E6%93%81% ...

  3. webpack 打包产生的文件名中,hash、chunkhash、contenthash 的区别

    table th:first-of-type { width: 90px; } hash 类型 区别 hash 每一次打包都会生成一个唯一的 hash chunkhash 根据每个 chunk 的内容 ...

  4. 基于MVC4+EasyUI的Web开发框架形成之旅(6)--基类控制器CRUD的操作

    在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...

  5. php exec返回状态为1

    之前在用到php exec 时 总是保存,返回状态1,那这时怎么排查呢 exec('ls 2>&1', $output, $return_val); print_r($output); ...

  6. 跟着未名学Office - 高效工作Outlook

    目录 第一篇邮件与联系人    1 第一节    使用与技巧    1 第二节    高效    11 第二篇    事务助手    21 第一节    日程管理    21 第二节    任务    ...

  7. pytest.2.运行多个文件

    From: http://www.testclass.net/pytest/multiple_tests/ 背景 在现实的测试活动中,我们经常会定义多个用例文件,用来实现业务逻辑或其他逻辑上用例的物理 ...

  8. 【枚举类型】Restful API请求--转换String为枚举类型

    IBaseEnum.java public interface IBaseEnum { public String getName(); } FuncEnum.java import com.sssl ...

  9. PAT 乙级1030 完美数列(25) C++版

    1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...

  10. 数据库SQL语言学习--上机练习3(插入 更新 删除)

    上机练习3 . 将一个新学生记录(学号::姓名:陈冬:性别:男:所在系:信息系:年龄:20岁)插入到Student表中: ALTER TABLE Student ,); UPDATE Student ...