参考请注意: 该文档创建于 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,你会看到:
总结: 至此,我们安装了两个
msi文件,如下列表:目前所有情况都还是正常的。看接下来的情况。
启动
基本概念
mongodb以db->collection->document的形式组织,类似于关系数据库的db->table->row
数据类型
mongodb中的数据采用键值对的形式存储。
基本数据类型,除了js中的之外,还有
- int32,int64,
- 对象id(12字节唯一id),
Objectid - Date(和js date一样,是离标准纪元的毫秒数
- 正则表达式
- js代码,
- 二进制(不超过16mb)
- Decimal128,主要用于金融类操作,
- 浮点数是64位的
- 数组和js的一样,类型不限制
注意:
- 关于整数:没理解,14页
-
内嵌文档
就是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进入命令行操作界面。 你修改你自己的数据库,没有权限:
直接root认证是认证不上去的。这是因为,MongoDB的用户权限和数据库是绑定的,需要给root加权限。你需要先use admin,然后通过db.auth('root', 'root password')认证;
认证成功,输入命令给root加权限:/*** 备注:该方案本人用着可行,执行之后能够改其它数据库数据。但可能不是最佳实践* (不但解决这个问题,还有其它可能涉及到这块的其他问题)*/db.system.users.update({ user: 'root' },{$pushAll: {roles: [{ role: 'userAdminAnyDatabase', db: 'admin' },{ role: 'dbOwner', db: 'admin' },{ role: 'clusterAdmin', db: 'admin' },],},})
vscode mongodb 插件
mongodb compass
查询
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],
}
`returnfields`通过文档的形式指定返回字段<a name="WUuCk"></a>## 更新<a name="Zofl8"></a>### db.update(condition, value[,upsert, multi, writeConcern])`value`是变量设置模式。```json{// 以 Object.assign 的方式设置数据"$set": {},// unset 去除字段,这里去除 company 字段"$unset": {"company": 1},// $inc 增加或减少数值"$inc": {"age": 5}// $push/$pushAll 数组插入项/多个项。如果字段不存在,会新建一个数组然后把内容push进去}
upsert是如果不存在记录是否插入一条,默认为falsemulti是查到多条符合条件的记录是否全改,默认false
目前所有情况都还是正常的。看接下来的情况。