前言
NPM mongoose是node.js中操作MongoDB常用到的ORM框架,本文記錄一下MongoDB的配置和連接方法.
MongoDB 配置文件修改(mongod.cfg)
- 打開連接認證之前要先添加用戶,否者無可用用戶登錄了
# 只可以在admin集合中創建特殊權限用戶
$ use admin
# 下邊兩個權限都可以
$ db.addUser( { user: "admin", pwd: "admin", roles: [ "userAdminAnyDatabase" ] } )
$ db.addUser( { user: "root", pwd: "root", roles: [ "root" ] } )
- 主要是為了打開MongoDB的連接認證,默認是任何人都可以操作數據庫(不安全),當然不打開也不影響后續操作
## 添加或取消注釋 下面代碼(有疑惑的可參考官方配置文檔)
security:
authorization: enabled
在項目中使用時的目錄結構
-
collections:存放文檔模型
-
connect.js: 連接數據庫
-
exec.js: 用於臨時調試執行語句
-
index.js: 導出所有文檔模型
部分代碼
-
以node.js為例
-
person.js
module.exports = function (mongoose) {
return mongoose.model('Person', new mongoose.Schema({
name: String,
age: Number
}));
};
- connect.js
const mongoose = require('mongoose');
const mongoConfig = global.config.mongodb;
// 帶認證的
mongoConfig.urls => 'mongodb://root:yourpass@localhost:27017/dev?authSource=admin&readPreference=primary&appname=MongoDB%20Compass&ssl=false'
// 不帶認證的
mongoConfig.urls => 'mongodb://localhost:27017/dev'
try {
mongoose.connect(mongoConfig.urls, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false,
autoIndex: false, // Don't build indexes
poolSize: 10, // Maintain up to 10 socket connections
serverSelectionTimeoutMS: 5000, // Keep trying to send operations for 5 seconds
socketTimeoutMS: 45000, // Close sockets after 45 seconds of inactivity
family: 4 // Use IPv4, skip trying IPv6
});
mongoose.connection.on('connected', () => {
console.mongo('MongoDB has been established successfully');
});
mongoose.connection.on('error', err => {
console.mongo('Unable to connect to the MongoDB:', err);
});
} catch (e) {
console.mongo('Unable to connect to the MongoDB:', err);
}
- connect.js
require('./connect'); // 創建連接
const fs = require('fs');
const path = require('path');
const mongoose = require('mongoose');
let db = {};
[
'collections' // 存放文檔模型的目錄,可以為多個
].forEach(function (rootFile) {
fs.readdirSync(path.join(__dirname, rootFile)).forEach(function (file) {
let url = path.join(__dirname, rootFile, file);
if (fs.statSync(url).isDirectory()) { // 也可以嵌套一層目錄
fs.readdirSync(url).forEach(function (subFile) {
let model = require(path.join(__dirname, rootFile, file, subFile))(mongoose);
db[model.modelName] = model;
});
} else {
let model = require(url)(mongoose);
db[model.modelName] = model;
}
});
});
module.exports = db;
增刪改查
- exec.js
const mongo = require('./index');
// 以下都以person模型為例
(async () => {
try {
// 增 save
const person = new mongo.Person({
name: 'xpp',
age: 19
});
const ret = await person.save();
console.log(ret);
// 增 create
// const ret = await mongo.Person.create({
// name: 'create',
// age: 19
// });
// console.log(ret);
// 修改 update / updateMany
// const ret = await mongo.Person.updateMany({
// name: 'create'
// }, {
// $set: {
// age: 20
// }
// });
// console.log(ret);
// 查找數據 find / findOne
// const ret = await mongo.Person.find({
// name: 'create'
// });
// console.log(ret);
// 刪除數據 remove / deleteOne / deleteMany
// const ret = await mongo.Person.remove({
// name: 'create'
// });
// console.log(ret);
} catch (e) {
console.log(e);
}
})();