之前团队一直都有人负责这个, 我只要调接口就好了, 这次要自己搞一下

win和客户端
  • win安装看这一篇: https://juejin.cn/post/6844904150635921422
  • 推荐客户端 robo 3T: robomongo.org/download
 brew install robo-3t
严重推荐知乎专区
  • 含金量十足啊
  • 数据库专家, 架构师, 数据组组长应该经常逛一逛
  • https://www.zhihu.com/topic/19560787/hot
安装和service
# 可能需要这个, 因为brew core已经移除了mongo, 因为mongo使用sspl协议
brew tap mongodb/brew
brew install mongodb-community
# 可能会出错, 此时, 重新tap就ok了.
brew untap mongodb/brew && brew tap mongodb/brew

# 启动macservice
brew services restart mongodb-community
# 也可以使用linux/unix的background process(后台进程)
mongod --config /usr/local/etc/mongod.conf --fork
# 如果m1芯片
mongod --config /opt/homebrew/etc/mongod.conf --fork
# mongod是主守护进程 primary daemon process

# 查看运行情况, mac service和后台进程
brew services list
ps aux | grep -v grep | grep mongod
开始使用
# 废弃了原本的mongo命令deprecated
mongosh # 这个等于是: mongosh "mongodb://localhost:27017"
# mongo tools 也可以直接使用
mongostat # 看状态
mongotop # 看分析, 读写
# 这货竟然不支持man, 牛死了

# 查看当前连接
db.getMongo()
# 可以改连接
Mongo()
connect()
使用js脚本(在mongo里面)
var tests = require('./tests.js')
var fs = require('fs');
load("myjstest.js")
load("scripts/myjstest.js")
load("/data/db/scripts/myjstest.js")
js连接
# 在项目中安装mongo支持
yarn add mongo

# 拿链接
db.getMongo() # mongosh里面可以拿
mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000
mongotop # mongotools也可以拿链接
2021-08-17T16:41:14.735+0800	connected to: mongodb://localhost/
js链接报错
# 神奇的是webpack watch时, 报一堆错误
WARNING in ./node_modules/mongodb/lib/bson.js 8:11-30
Module not found: Error: Can't resolve 'bson-ext' in '/node_modules/mongodb/lib'
 @ ./node_modules/mongodb/lib/index.js 31:13-30

WARNING in ./node_modules/mongodb/lib/deps.js 22:4-42
Module not found: Error: Can't resolve 'kerberos' in 

WARNING in ./node_modules/mongodb/lib/deps.js 28:4-38
Module not found: Error: Can't resolve 'snappy' in 

WARNING in ./node_modules/mongodb/lib/deps.js 41:4-34
Module not found: Error: Can't resolve 'aws4' in 

WARNING in ./node_modules/mongodb/lib/encrypter.js 83:38-74
Module not found: Error: Can't resolve 'mongodb-client-encryption' 

# stackoverflow说是编译器的问题. 然并卵
xcode-select --install 
rm -rf node_modules
npm cache clean --force
npm install # 我用yarn

# stackoverflow说是webpack配置问题, 然并卵
		{
			test: /\.m?js/
			resolve:
				fullySpecified: false
			
		}
# 怀疑是中文问题, 然并卵
js链接副本replica
mongodb://host1:27017,host2:27017,host3:27017/?replicaSet=myRs
配置文件
# 基础配置迁移了 ~/.mongorc.js to ~/.mongoshrc.js.
mv ~/.mongorc.js ~/.mongoshrc.js

# 查看配置文件, 非m1芯片
mate /usr/local/etc/mongod.conf

# 默认的mongod.conf
systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb
net:
  bindIp: 127.0.0.1
数据和log位置
/usr/local/var/log/mongodb
/usr/local/var/mongodb
# m1芯片对应在/opt/homebrew 和配置文件的对应关系一致
主要操作
# ----------1.库操作------------
db # 显示当前所在数据库,默认为 test
show dbs # 列出可用数据库
show tables # 列出数据库中可用集合
show collections # 同上
use <database> # 用于切换数据库
use exam # 切换使用exam库, 如果不存在就新建一个

# ---------2.collections操作-----------
#对应于table操作, 奶奶的mongo干掉了table?
# 对于collection, 同样如果不存在就新建, 例如下面一句就新建了collection: inventory
db.inventory.insertMany([
   { item: "journal", qty: 25, status: "A", size: { h: 14, w: 21, uom: "cm" }, tags: [ "blank", "red" ] },
   { item: "notebook", qty: 50, status: "A", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank" ] },
   { item: "paper", qty: 10, status: "D", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank", "plain" ] },
   { item: "planner", qty: 0, status: "D", size: { h: 22.85, w: 30, uom: "cm" }, tags: [ "blank", "red" ] },
   { item: "postcard", qty: 45, status: "A", size: { h: 10, w: 15.25, uom: "cm" }, tags: [ "blue" ] }
]);

# MongoDB adds an _id field with an ObjectId value if the field is not present in the document

# -------3.collection内部的数据查询-----------
db.inventory.find({})
db.inventory.find({}).pretty()

# -------4. 条件查询-----------
db.inventory.find( { status: "D" } );
db.inventory.find( { qty: 0 } );
db.inventory.find( { qty: 0, status: "D" } );
db.inventory.find( { "size.uom": "in" } )
db.inventory.find( { tags: "red" } )
db.inventory.find( { tags: [ "red", "blank" ] } )
db.inventory.find( { tags: [ "blank","plain" ] } )

# -------5. 指定返回值---------
# 1代表返回, 0代表不返回. field:1/0
db.inventory.find( { }, { item: 1, status: 1 } );
db.inventory.find( {}, { _id: 0, item: 1, status: 1 } );

# 关闭mongo server
use admin
db.shutdownServer()

# 启动monitor
db.enableFreeMonitoring()
# 停止monitor
db.disableFreeMonitoring()
概念
  • 文档 = 记录
查询
# 第一个参数为查询条件:
db.drivers.find() #查找所有文档
{ "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 18 }
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }
{ "_id" : 91, "name" : "Sun1feng", "age" : 34 }

db.drivers.find({name: "Xiaose"}) #查找 name 为 Xiaose 的文档
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }

db.drivers.find({age:{$gt:20}}) #查找 age 大于 20 的文档
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }
{ "_id" : 91, "name" : "Sun1feng", "age" : 34 }

# 第二个参数是投影, 就是使用那些字段
db.drivers.find({age:{$gt:20}},{name:1})
# 年龄大于二十的doc, 只看名字

# 花式find, 如果不在索引上面, 那么很可能影响效率
db.collection.find().sort({KEY:1}) # 排序
db.user.find({"age":{$lt:30}}).sort({age:1}).pretty()
# 所有年龄小于30岁的用户查询出来并将其按照年龄升序排列

# 通过 count、skip、limit 等指针(Cursor)方法,改变文档查询的执行方式
db.drivers.find().count() #统计查询文档数目
db.drivers.find().skip(1).limit(10).sort({age:1})
# 跳过 1 个文档,限制输出 10 个,以 name 子段正序排序(大于 0 为正序,小于 0 位反序)输出结果

# 提升易读性
db.drivers.find().pretty()

操作
  • 新建库
# use 一个不存在的数据库, 然后插入数据就导致建库了
use newDatabase # 使用新的bd: newDatabase
db.xxx.insert({x:1}) # 这里其实在newDatabase新建了一个名为xxx的collecation, 里面有一个doc内容是{x:1}
  • 插入
db.drivers.insert({name:"Chen1fa",age:18})
db.drivers.insert({name:"Xiaose",age:35})
db.drivers.insert({_id:91,name:"Sun1feng",age:34})
//要注意,age:18和age:"18"是不一样的,前者插入的是数值,后者插入的是字符串。插入新文档如果未指定 _id,mongoDB 会自动为插入的文档添加 _id 字段。
  • 更新
db.collection.update(
    <query>, # 查询条件
    <update>, # 修改条件
    {
        upsert: <boolean>, # 查询为空时插入文档, 默认false
        multi: <boolean>  # 更新所有符合条件的文档, 默认false
    }
)

# 将 name 字段为 Chen1fa 的文档,更新 age 字段为 30
db.drivers.update({name:"Chen1fa"},{name:"Chen1fa", age:30})
# 如果更新文档只传入 age 字段,那么文档会被更新为{age: 30},而不是{name:"Chen1fa", age:30}。要避免文档被覆盖,需要用到 $set 指令,$set 仅替换或添加指定字段:
db.drivers.update({name:"Chen1fa"},{$set:{age:30}})

# 在查询的文档不存在的时候插入文档,要把 upsert 参数设置真值
db.drivers.update({name:"Alen"},{age:24},{upsert: true})

# 默认情况只更新一个文档,如果要更新符合条件的所有文档,要把 multi 设为真值,并使用 $set 指令
db.drivers.update({age:{$gt:25}},{$set:{license:'A'}},{multi: true})
db.drivers.update({age:{$lt:25}},{$set:{license:'C'}},{multi: true})

  • 删除
db.drivers.remove({name:"Xiaose"}) #删除所有 name 为 Xiaose 的文档
db.drivers.remove({age:{$gt:30}},{justOne:true}) #删除所有 age 大于 30 的文档

  • 索引
db.article.getIndexes() #查看article这个collection的索引
# 默认只有id有索引
  • 更多不重要操作
aggregate() # 等于group by
db.article.find({title:{$regex:"教程"}}) # 使用正则
db.article.find({title:{$regex:"elasticsearch",$options:"$i"}}) # 正则标志位使用$options
参考
  • 官方入门指引: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/

  • 官方mongo tools: https://docs.mongodb.com/database-tools/

  • 看manual不要看guide, guide很老没更新, 这个安装很详细: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/

  • 终于找到了tutorial, 注意这个有step1-step5, 要一个一个点开才可以: https://docs.mongodb.com/manual/tutorial/getting-started/

  • js操作的样例代码才是关键: https://docs.mongodb.com/drivers/node/current/usage-examples/insertMany/