MongoDB
NoSQL数据库:可以类似关系型数据库,但不需要预先创建Table,也不需要预设字段类型长度,数据也不需要有相同的结构
图形化管理工具可用 compass/navicat
可通过 Mongoose 与 NodeJS 交互,也有与 R 交互的 mongolite 包 (GIS示例),与 SpringBoot 的交互示例
应用:GeoJson -- GIS/游戏地图 数据,在线chatbot会话储存...
| SQL | MongoDB |
|---|---|
| Table | Collection |
| Row | Document (a Record in Binary JSON) 每一条数据以文档的形式存储! |
| Column | Field |
| Index | Index |
| Primary Key | _id |
join |
$lookup |
groupby |
$group |
简易示例
建议遵照 v5.0教程 apt安装 --- 也可以下载对应操作系统的 MongoDB Community Server/Tools 后 sudo dpkg -i xx.deb(-l list / -r remove)
随后,启动 mongod 进程
sudo systemctl daemon-reload ## 更新所有服务的配置文件,port占用见 ss -tlnp
sudo systemctl start mongod ## start / stop / restart / enable设置开机启动
sudo systemctl status mongod ## 查看运行状态
注意,WSL中或许需要安装 Systemd 套件,而如果出现 status=14 错误则需要修改以下权限
sudo chown -R mongodb:mongodb /var/lib/mongodb ## /etc/mongod.conf 中配置的 dbPath
sudo chown mongodb:mongodb /tmp/mongodb-*.sock
sudo touch /etc/init.d/mongod
sudo chmod +x /etc/init.d/mongod
成功后,可以使用 mongosh Shell 进行交互,默认为 test 数据库,可用 show dbs 查看其它,然后 use anotherDB 新建/切换至其它数据库
mongosh
增/删/改/查见 教程,此处增加两个 User
db.userCollection.insertMany([
{name : "Ann", age : 10} ,
{name : "Bee", age : 20} , // 自动生成 _id: ObjectId('67f382376609a69b4a6b140b')
])
db.userCollection.find().sort({age: 1}) // Find all Users & 排列: 升序(1)降序(-1)
db.userCollection.find({age: {$gt: 10} }) // Find age>10 Users
db.userCollection.find({name: {$regex: /a*n/ , $options: 'i' } })
db.userCollection.countDocuments()
Mongoose
npm install mongoose --save 本地安装后,进入 node
//import { createRequire } from 'module';
//const require = createRequire(import.meta.url);
const dbURL = 'mongodb://127.0.0.1:27017/test';
const options = {};
const mongoose = require('mongoose');
mongoose.connect(dbURL,options).then( ()=>{console.log("Connected")} ).catch( (err)=>{console.log(err)} )
// Schema and Model !!
const UserSchema = new mongoose.Schema({name: String, age: Number});
const User = mongoose.model("user",UserSchema,"userCollection") // Default collection will be user+s !!!
// Save to DB
let Cee = new User({name: 'Cee', age: 30})
Cee.save().then( (obj)=>{console.log(obj.name)} )
// Load from DB
await User.findOne({age: {$gt: 10}})
for await (const item of User.find()) {
console.log(item.name,item.age);
}