MongoDB基礎2——Mongoose的操作指南

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——findOnefind

使用 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容