参考请注意: 该文档创建于 2022/3/14,请注意随时间流逝文档信息是否过时,是否还有可参考的价值。 该文档仅作为个人笔记记录。 该文档记录时,使用的软件等版本会列在文档中,请注意识别。 对于该文档中个人使用的一些问题的解决方案,不一定是最佳实践(解决该问题,且尽可能解决其它可能涉及到这块的其他问题),与此相关的建议欢迎评论补充。

相关资源

https://www.yuque.com/zhangshuaiyin/yygh-parent/gkdffa

安装(Windows)

官方安装文档:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/
安装msi后,还需要安装mongosh,按照文档上的指示安装第二个安装包。
安装完毕后,开一个新终端,运行mongosh,你会看到:
image.png

总结: 至此,我们安装了两个msi文件,如下列表: image.png 目前所有情况都还是正常的。看接下来的情况。

启动

开终端,输入mongosh启动。

基本概念

mongodb以db->collection->document的形式组织,类似于关系数据库的db->table->row

数据类型

mongodb中的数据采用键值对的形式存储。
基本数据类型,除了js中的之外,还有

  • int32,int64,
  • 对象id(12字节唯一id),Objectid
  • Date(和js date一样,是离标准纪元的毫秒数
  • 正则表达式
  • js代码,
  • 二进制(不超过16mb)
  • Decimal128,主要用于金融类操作,
  • 浮点数是64位的
  • 数组和js的一样,类型不限制

注意:

  1. 关于整数:没理解,14页
  2. 关于Date时区问题:如java等语言是按照

    内嵌文档

    就是js对象嵌套。
    其中,mongodb按照DBref的格式存储对象引用,具体是:
    { "$ref": <集合名称>, "$id": <引用的id>, "$db": <数据库名称> }
    其中,每一个文档有一个_id键,类型一般都是Objectid,其值是唯一的
    Objectid前4字节是时间戳(只要保证生成不断增加即可,时间同步不重要)
    4-6三个字节是机器号;7-8字节是产生这个Objectid的进程标识符;
    9-11字节是计数器

    使用

    docker

    可以部署mongo的镜像。
    环境变量:
    MONGO_INITDB_ROOT_USERNAME, MONGO_INITDB_ROOT_PASSWORD分别是root用户的用户名密码
    MONGO_INITDB_DATABASE是初始化的数据库

    数据库操作

    命令行

    这里使用docker中的mongodb来做实验。
    首先进入之后先mongo进入命令行操作界面。

  3. 你修改你自己的数据库,没有权限:
    直接root认证是认证不上去的。这是因为,MongoDB的用户权限和数据库是绑定的,需要给root加权限。你需要先use admin,然后通过db.auth('root', 'root password')认证;
    认证成功,输入命令给root加权限:

    1. /**
    2. * 备注:该方案本人用着可行,执行之后能够改其它数据库数据。但可能不是最佳实践
    3. * (不但解决这个问题,还有其它可能涉及到这块的其他问题)
    4. */
    5. db.system.users.update(
    6. { user: 'root' },
    7. {
    8. $pushAll: {
    9. roles: [
    10. { role: 'userAdminAnyDatabase', db: 'admin' },
    11. { role: 'dbOwner', db: 'admin' },
    12. { role: 'clusterAdmin', db: 'admin' },
    13. ],
    14. },
    15. }
    16. )

    vscode mongodb 插件

    直接输入链接字符串连就行。注意只支持 3.6 以上的版本。

    mongodb compass

    直接输入链接字符串连就行。注意只支持 3.6 以上的版本。

    查询

    db.find(condition, returnfields)

    condition是文档。
    以键值对的形式表示条件:"key": ValueCondition;
    查文档深层的字段:"key.layer1.layer2": ...
    如果条件是等于,直接写值即可。此外,使用模式对象表示,如: ```json { // $not 直接取非 // 或 “$or”: [ { “age”: 16 }, { “age”: 18 } ], // 大于 $gt 小于 $lt 大于等于 $gte 不等于 $ne // 字段存在 $exists “$exists”: true, // 取模 “$mod”: [10, 0],

}

  1. `returnfields`通过文档的形式指定返回字段
  2. <a name="WUuCk"></a>
  3. ## 更新
  4. <a name="Zofl8"></a>
  5. ### db.update(condition, value[,upsert, multi, writeConcern])
  6. `value`是变量设置模式。
  7. ```json
  8. {
  9. // 以 Object.assign 的方式设置数据
  10. "$set": {},
  11. // unset 去除字段,这里去除 company 字段
  12. "$unset": {"company": 1},
  13. // $inc 增加或减少数值
  14. "$inc": {"age": 5}
  15. // $push/$pushAll 数组插入项/多个项。如果字段不存在,会新建一个数组然后把内容push进去
  16. }

upsert是如果不存在记录是否插入一条,默认为false
multi是查到多条符合条件的记录是否全改,默认false

db.remove(condition[, justone=false])