• MongoDB的增删改查(CRUD)初体验


    五一第一天,祝自己生日快乐的同时,中午闲来无事,打开了硬盘上早已下载好的大地的免费课程 ,从 mongodb 的安装、环境配置,再到简单的在命令行中的 CRUD 操作,算是有了个初体验。

    这里还是要感谢大地老师,慷慨的提供了够我看很久的免费视频,所以也愿意贴个链接表示感谢,最初是在 nodejs 中文社区看到的推广地址。

    继续回到 mongodb,官网下载后,windows 中要配置环境变量,将 mongodb 的安装路径(跟着官网的安装步骤,默认安装到 c 盘就行了),一直找到 /bin目录, 然后复制路径,设置到 windows 中的 path 全局环境变量中就行。

    当然,由于目前只学了在 CMD 中进行 CRUD,所以简单记录一下,具体的语法自己看视频,或者看文档就行:


    增 Create

    1. use some_database_name 还不算创建数据库,只有真正向某个集合(表)中插入了数据之后,才会创建数据库 some_database_name:
    db.user.insert({"name": "xiaoming", "age": 25})
    

    查 Retrieve

    1. 终端中输入 db,可以查看当前处于哪个数据库中,输入show dbs,查看当前创建了哪些数据库,输入 show collections 查看当前数据库有哪些集合(表)。
      假如查询分页数据,比如 age 为 25 的记录,每一次返回10条,同时跳过之前的数据记录,这时候下面两种写法效果一样,我的解释是,skip 优先级更高,即两种写法都会先跳过10条数据,然后才会返回 limit 指定数目的数据:
    db.user.find({"age": 25}).skip(10).limit(10)
    // 反过来想想,先返回10条数据,然后又跳过了10条数据,那岂不是返回空,所以是不可能的
    db.user.find({"age": 25}).limit(10).skip(10)
    
    1. 如果对返回数据进行 sort 排序呢?其实这里的链式调用似乎有些误导性,据我测试,实际上是对 find 出来的结果,首先就进行了 sort 排序,然后是 skip,最后才是 limit (逻辑顺序上是这样,具体 mongodb 内部如何处理,不详):
    db.user.find({"age": 25}).limit(10).skip(10).sort(10)
    

    改 Update

    1. 修改数据时注意是根据第一个参数进行查找,然后根据提供的第二个参数,修改查找到的第一项返回结果。如果指定了$set,那么会根据 $set的属性和查到到的结果进行比对,如下所示,name 会更新为 xiaoming666,同时会增加age 字段:
    db.user.find() // 假设返回如下:
    { "_id" : ObjectId("5cc952aadaf6816433a1a06a"), "name": "xiaoming", "sex": "男" }
    // 然后更新:
    db.user.update({"name": "xiaoming"}, {$set: {"name": "xiaoming666", "age": 18}})
    // 此时结果为:
    { "_id" : ObjectId("5cc952aadaf6816433a1a06a"), "name": "xiaoming666", "sex": "男", "age": 18 }
    
    

    那如果不指定 $set 属性,则会用update 时的第二个参数,覆盖根据第一个参数查找到的第一项数据:

    // 接着上面进一步操作:
    db.user.update({"name": "xiaoming"}, {})
    // 可以看到完全被替换了,只剩下自带的 "_id" 字段
    { "_id" : ObjectId("5cc952aadaf6816433a1a06a") }
    

    删 Delete

    1. 删除数据时,如果删除了数据库中所有的集合(表),那么数据库也会自动被删除,或者直接删除数据库:
    db.some_collection_name.drop() // 1. 删除集合(表)
    db.dropDatabase() // 2. 直接删除当前正在 use 的数据库
    

    使用 remove 删除数据时,如果传入了 {} 会删除该集合下的所有数据,否则只会删除根据参数条件匹配到的数据,也可以传入第二个可选参数,指定 justOne 字段,表示只删除匹配项的第一条数据:

    db.user.remove({})
    db.user.remove({"name": "xiaoming"}) // 删除 user 集合中所有 name 是 xiaoming 的数据
    db.user.remove({"name": "xiaoming"}, {"justOne": true}) // 只删除匹配项的第一条
    

    个人学习中的小记录,不定期更新/更正,方便日后自我查阅,理解粗浅,如有明显误导,抱歉望斧正。

    参考连接:
    1. 大地的免费课程

  • 相关阅读:
    远程诊断DoIP
    基于linux内核包过滤技术的应用网关
    Boost内存池使用与测试
    C++ 编程规范
    大象——Thinking in UML
    C++ 创建类时常考虑的问题
    SLIP—串行线路上传输数据报的非标准协议
    神秘的程序员——编程的乐趣
    Bad Smell (代码的坏味道)
    模式与软件架构——软件架构的非功能特征
  • 原文地址:https://www.cnblogs.com/nicholaswang/p/10810111.html
Copyright © 2020-2023  润新知