Mongoose是在node.js環境下對mongodb進行便捷操做的對象模型工具javascript
一開始須要安裝node.js環境以及mongodb數據庫,而後建立mongdb數據文件夾而且啓動mongdb(windows安裝啓動mongodb)。html
connect 用於鏈接數據庫java
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不具有操做數據庫的能力node
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字段類型mongodb
Model是由Schema編譯而成的假想(fancy)構造器,具備抽象屬性和行爲。Model的每個實例(instance)就是一個document。document能夠保存到數據庫和對數據庫進行操做。數據庫
//建立並導出model
const db= {
User: mongoose.model('MUser', muserSchema),
};
module.exports = db;
複製代碼
如今咱們就完成了mongodb的數據鏈接,數據對象模型的建立。json
引入以前導出的模型mongodb數據const db = require('../models/db')
windows
find用來查詢並輸出該條件下的全部文檔 db.Userl.find({conditions}, {options}, callback)
conditions Object類型 //查詢條件 options Object 類型 //查詢配置參數 callback Function //回調數組
// 查詢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相似,但只返回單個文檔app
db.Article.findOne({title: req.body.title}, function(err, docs){
if (err) {
console.log('出錯'+ err);
}
res.json(docs);
})
複製代碼
與findOne相似,但它接收文檔的 _id 做爲參數,返回單個文檔。_id 能夠是字符串或 ObjectId 對象。
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」}}})