0.目標
本文主要介紹了在Node.js中使用Express+Mongoose對MongoDB進行操作的一些方法。
歡迎閱讀MongoDB相關文章:
MongoDB基礎0——MongoDB的安裝與可視化管理工具
MongoDB基礎1——數據庫基本操作
MongoDB基礎2——Mongoose的操作指南
MongoDB基礎3——Mongoose的數據交互問題
MongoDB基礎X——踩過的坑以及解決方案(持續更新中)
1.連接數據庫
/* ******* config/mongodb.js文件 ******* */
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/backup');
exports.mongoose = mongoose;
上面代碼連接了名為 backup
的數據庫
2.建立Schema
在models目錄下創建一個task.js文件
/* ******* models/tasks.js文件 ******* */
var mongodb = require('./../config/mongodb');
var Schema = mongodb.mongoose.Schema;
var taskScheMa = new Schema({
name : String,
brief : String,
level : String,
type : String,
id : String,
date : Date,
logs : [],
});
這里創建了一個Schema,用于建立對數據庫某一個集合操作的模型。
要注意的是,到這一步,還沒有把Schema關聯到數據庫的集合,還需要執行下面代碼:
var Task = mongodb.mongoose.model('tasks', taskScheMa); // 與tasks集合關聯
接下來,我們需要提供一些接口給外部調用,如查詢數據、更新數據、刪除數據。基本的框架如下:
var TaskDAO = function(){};
// 提供的外部接口
// ...
/* 例如:
TaskDAO.prototype.example = function(input, callback) {
// ...
};
*/
// Export
module.exports = new TaskDAO();
下面,我將對CURD操作數據庫的方法進行簡單的說明。
3.基本查詢
3.1——findOne
和 find
使用 findOne
查詢,返回單個文檔。如果不要求僅返回一個文檔,可使用 find
方法
/* Read */
TaskDAO.prototype.getByName = function(name, callback) {
Task.findOne({name:name}, function(err, obj){
callback(err, obj);
});
};
上面代碼意思是返回name字段為傳入的參數name的值的文檔。如果還要增加條件,如id為0,則可寫作:
/* Read */
TaskDAO.prototype.getByName = function(name, callback) {
Task.findOne({name:name, id:0}, function(err, obj){
callback(err, obj);
});
};
3.2 基本查詢2——限制查詢結果
在上面定義的Schema中,如果不希望返回logs,則可增加一個限制條件 {"logs":0}
,具體代碼如下:
TaskDAO.prototype.getByUser_Reduced = function(user, callback) {
Task.find({releaser:user}, {"logs":0}, function(err, obj){
callback(err, obj);
});
};
如果需要限制返回結果的長度(如僅返回5個文檔),則可加入限制條件 {limit: 5}
,具體代碼如下:
TaskDAO.prototype.getByUser_Reduced = function(user, callback) {
Task.find({releaser:user}, {"logs":0}, {limit: 5}, function(err, obj){
callback(err, obj);
});
};
3.2 基本查詢3——OR查詢
如果我們要查找user為“用戶1”或者type為“缺省”的文檔,可以使用 $or
:
TaskDAO.prototype.getByUser = function(user, callback) {
var query = { "$or" : [ {user: "用戶1"}, {type: "缺省"} ] };
Task.find(query, function(err, obj){
callback(err, obj);
});
};
4.插入文檔
下面代碼將task對象存入數據庫。task對象的結構可以和Schema定義的不同,但存入數據庫的內容只能是Schema定義了的結構。
TaskDAO.prototype.addFullTask = function(task, callback) {
var instance = new Task(task);
instance.save(function(err, obj){
console.log(err);
callback();
});
};
5.更新文檔
5.1 更新文檔內容
使用 $set
修改前可設定一個字段的值,如果這個字段不存在,則創建這個字段。
/* Update */
TaskDAO.prototype.updateByName = function(name, obj, callback) {
Task.update({name:name}, {$set:{level:obj.level, type:'更新操作'}}, function(err, obj){
callback(err, obj);
});
};
上面的代碼執行后,會查找name字段為name的文檔,并更新該文檔的level字段和type字段。(注意,數據庫中可以不必預先定義level或type字段,但Schema中必須有該字段,否則在數據庫層面是不會對Schema中未定義的字段進行操作的)
5.2 更新文檔嵌入內容
以上面定義的Schema為例,如果要將一個對象插入到logs數組中,可以這么寫:
// Add to an array
TaskDAO.prototype.updateLogsByIndex = function(id, obj, callback) {
Task.update({id:id}, {$addToSet:{logs:obj}}, function(err, obj){
callback(err, obj);
});
};
執行完上面代碼后,會在id為id的文檔中,在其logs字段里添加一個對象obj。
6.刪除文檔
使用 remove
來刪除文檔
/* Delete / remove */
TaskDAO.prototype.delByName = function(name, callback) {
Task.remove({name:name}, function(err, obj){
callback(err, obj);
});
};
7.結束
本文介紹了一些基本的操作方法,主要參考了《MongoDB權威指南》以及mongoose相關資料。
更多權威資料,請參考下面網站:
http://www.nodeclass.com/api/mongoose.html#quick_start
原創文章,未經許可,請勿轉載
作者:Mike的讀書季
日期:2016.08.08
QQ:1139904786
Blog:http://blog.csdn.net/kkdestiny