Mongoose是在node.js環境下對mongodb進行便捷操做的對象模型工具
一開始須要安裝node.js環境以及mongodb數據庫,而後建立mongdb數據文件夾而且啓動mongdb(windows安裝啓動mongodb)。javascript
connect 用於鏈接數據庫html
mongoose.connect(uri(s), [options], [callback]) //url(s):數據庫地址,能夠是多個,以`,`隔開 //options:可選,配置參數 //callback:可選,回調 // 規則 mongoose.connect('mongodb://數據庫地址(包括端口號)/數據庫名稱') // 鏈接mongodb示例 mongoose.connect('mongodb://localhost:27017/db'); //鏈接本地默認27017端口的mongodb //鏈接指定用戶鏈接示例 mongoose.connect('mongodb://用戶名:密碼@127.0.0.1:27017/數據庫名稱') //鏈接多個數據庫示例 //若是你的app中要鏈接多個數據庫,只須要設置多個url以,隔開,同時設置mongos爲true mongoose.connect('urlA,urlB,...', { mongos : true })
schema能夠理解爲mongoose對錶結構的定義(不單單能夠定義文檔的結構和屬性,還能夠定義文檔的實例方法、靜態模型方法、複合索引等),每一個schema會映射到mongodb中的一個collection,schema不具有操做數據庫的能力java
const mongoose = require('mongoose'); const {Schema} = mongoose; // 用戶對象模型 const userSchema = new Schema({ name: { type: String, //類型 default: Date.now // 默認值 }, avatar: { type: String, required: true //必須有值 }, user: String, passworld: String, hash: String, score: Number, learn: Array, message: Array, star: Array, sign: Array, signdate: String, isregister: Boolean, });
schema字段類型node
Model是由Schema編譯而成的假想(fancy)構造器,具備抽象屬性和行爲。Model的每個實例(instance)就是一個document。document能夠保存到數據庫和對數據庫進行操做。mongodb
//建立並導出model const db= { User: mongoose.model('MUser', muserSchema), }; module.exports = db;
如今咱們就完成了mongodb的數據鏈接,數據對象模型的建立。數據庫
引入以前導出的模型mongodb數據const db = require('../models/db')
json
find用來查詢並輸出該條件下的全部文檔db.Userl.find({conditions}, {options}, callback)
conditions Object類型 //查詢條件
options Object 類型 //查詢配置參數
callback Function //回調windows
// 查詢Article模型下全部數據 db.Article.find({}, function(err, docs){ if (err) { console.log('出錯'+ err); return; } res.json(docs); // 以json格式輸出 }); // 查詢Article模型下state字段爲'publish'的內容,而且不輸出articleContent和user字段內容。注!(1爲只輸出該字段,0爲不輸出該字段) db.Article.find({state: "publish"}, {articleContent: 0,user: 0}, function(err, docs){ if (err) { console.log('出錯'+ err); return; } res.json(docs); }); //查詢閱讀量大於500小於600的文章 db.Article.find(({views: {$gte: 500, $lte: 600}}), function(err, docs){ if (err) { console.log('出錯'+ err); return; } res.json({data:docs}); }) // 複雜條件查詢 //$ro 查詢該模型下的title字段或者tag字段,$regex 爲正則匹配實現模糊查詢,$options爲不區分大小寫 db.Article.find({ $or: [{title: {$regex: searchval, $options:'i'} }, { tag: {$regex: searchval, $options:'i' }}] }}, function(err, docs){ if (err) { console.log('出錯'+ err); return; } res.json({data:docs}); })
與find相似,但只返回單個文檔數組
db.Article.findOne({title: req.body.title}, function(err, docs){ if (err) { console.log('出錯'+ err); } res.json(docs); })
與findOne相似,但它接收文檔的 _id 做爲參數,返回單個文檔。_id 能夠是字符串或 ObjectId 對象。app
db.Article.findOne(id, function(err, docs){ if (err) { console.log('出錯'+ err); } res.json(docs); })
返回符合條件的文檔數。
db.Article.count(id, function(err, docs){ if (err) { console.log('出錯'+ err); } res.json(docs); })
當查詢比較複雜時,用 where:
db.Article.where('age').gte(25) .where('tags').in(['movie', 'music', 'art']) .select('name', 'age', 'tags') .skip(20) .limit(10) .asc('age') .slaveOk() .hint({ age: 1, name: 1 }) .run(function(err, docs){ if (err) { console.log('出錯'+ err); } res.json(docs); }));
有時咱們須要在 mongodb 中使用 javascript 表達式進行查詢,這時能夠用 find({$where : javascript})
方式,$where 是一種快捷方式,並支持鏈式調用查詢。
db.MUser.$where('this.firstname === this.lastname').exec((err, docs) => { res.json({docs}); });
sort爲排序方法,爲該字段正序或者倒序輸出內容(-1爲倒序)
skip爲跳過多少條目
limit 爲限制輸出多少條
// 實現文章分頁,按時間倒序排列輸出 db.Article.find({tag:req.params.labe}, function(err, docs){ if (err)return; res.json(docs) }).sort({date:-1}).skip(page*pagenum).limit(pagenum)
save是一個實例方法,使用時須要先 new Model() 來實例化
//保存一個用戶信息,userobj爲你建立的文檔對象模型裏的字段,需正確對應傳入 const userobj={ email: query, passworld: req.body.passworld, hash: hash, isregister: false, score: 5, sign: [], signdate: '' } new db.MUser(userobj).save(function(error){ if (error) { res.status(500).send() return } res.json({statu: 200}) })
刪除數據方法
db.Course.remove({_id: req.body.id}, function(err, docs){ if (err) { res.status(500).send(); return } res.json({statu: 200}) })
更新數據方法
// 更新指定email字段數據條目下字段爲content的內容,若是不存在就建立該字段 db.Share.update({email: email},{$set:{content: newarr}}, function(err, docs){ if (err) { res.status(500).send(); return } res.json({statu: 200}); }) //$set 指定字段的值,這個字段不存在就建立它。能夠是任何MondoDB支持的類型。 Article.update({_id : id}, {$set : {views : 51, title : ‘修改後的標題’ …}}) //$unset 同上取反,刪除一個字段 Article.update({views : 50}, {$unset : {views : ‘remove’}}) //執行後: views字段不存在 //$inc 增減修改器,只對數字有效。 Article.update({_id : id}, {$inc : {views : 1}}) //$push 爲字段爲數組的內容push數據 Article.update({_id : id}, {$push : {message : messageobj}}) //$pop從頭部或尾部刪除單個元素(1爲從後面刪除,-1爲從前面刪除) db.Article.update(({_id: id), {$pop:{relationships: -1}) //__$pull__刪除知足條件的元素,不止刪除一個 db.Article.update(({_id: id), {$pull:{「relationships」:{「fname」:」dongren」, 」lname」: 」zeng」}}})
$set 指定字段的值,這個字段不存在就建立它。能夠是任何MondoDB支持的類型。
Article.update({_id : id}, {$set : {views : 51, title : '修改後的標題' ...}})
$unset 同上取反,刪除一個字段
Article.update({views : 50}, {$unset : {views : 'remove'}})
//執行後: views字段不存在
$inc 增減修改器,只對數字有效。
Article.update({_id : id}, {$inc : {views : 1}})
$push 爲字段爲數組的內容push數據
Article.update({_id : id}, {$push : {message : messageobj}})
$pop 從頭部或尾部刪除單個元素(1爲從後面刪除,-1爲從前面刪除)
db.Article.update(({_id: id), {$pop:{relationships: -1})
$pull 刪除知足條件的元素,不止刪除一個
db.Article.update(({_id: id), {$pull:{「relationships」:{「fname」:」dongren」, 」lname」: 」zeng」}}})