nodejs-7.1. mongoose模塊


mongoose模塊

一. 概念:

  介紹:是一個第三方模塊, 作用:方便在nodejs代碼中操作mongodb

  GitHub 地址: https://github.com/Automattic/mongoose

★ nodejs-mongo-mongod關系圖:

 

二、mongoose主要知識點:

1. _id 是 mongodb 集合中的默認主鍵. 是唯一的.

2. schema 、 model 與 entity 的關系: 符合ORM

★ ORM 對象數據綁定文檔集合,對象在文檔就在,對象不再文檔也就不再。

## 類比: 生產瓶蓋
Schema(架構) => 模具設計稿
Model(模型) => 模具
Entity(實體) => 瓶蓋

## mongoose 命名時的推薦: 為了方便好記

UserSchema UserModel UserEntity

ArticleSchema ArticleModel ArticleEntity

GoodsSchema GoodsModel GoodsEntity

3. 一般集合數據表名定義為英文單詞單數,mongoose 會自動將集合名稱變成復數.

4. schema設定文檔字段允許的字段類型:

  String
  Number
  Date
  Buffer (字符串類型)
  Boolean
  Mixed  (任意類型)
  ObjectId (主鍵信息數字ID)
  Array

 

三. 代碼使用:
1. 進入工作目錄: cd 文件夾路徑
2. 安裝: cnpm install mongoose --save
3. 操作: 代碼栗子鏈接
  3.1 插入數據 

//實體對象
var ArticleEntity = new ArticleModel({
  title: 'cctv',
  content: '下雨天',
  author: 'xf',
  date: Date.now(),
  click: 1
});

//寫入  save 保存
ArticleEntity.save(function(err, doc){
  if(err){
    console.log(err)
  }else{
    console.log(doc);
  }
  mongoose.connection.close();
})
//1. 引入mongoose
var mongoose = require('mongoose');

//2. 連接mongodb數據庫
mongoose.connect('mongodb://localhost/db3');

//3. 定義文檔結構
var UserSchema = new mongoose.Schema({
username: String,
password: String,
}, {versionKey: false});

//4. 定義模型
var UserModel = mongoose.model('user', UserSchema);

//5. 創建實體
var UserEntity = new UserModel({
username: 'admin',
password: 'adminxxxxx'
});

//6. 寫入數據庫
UserEntity.save(function(err, user){
if(err){
console.log(err);
}else{
console.log(user);
}
//7. 關閉連接
mongoose.connection.close();
});
app.js

  或者另一種方法插入數據:

    articleModel.create(req.body, function (err) { })

 

  3.2 刪除數據
    ArticleModel.find({id: 100}).remove(function(err){ });
    UserModel.remove({id: 200}, function(err){ })

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/db6');

//文檔結構
var ArticleSchema = new mongoose.Schema({
  title: String,
  content: String,
  author: String,
  date: Date,
  click: Number
});

//創建模型
var ArticleModel = mongoose.model('article', ArticleSchema);

//刪除  方式一
/**
 * 
ArticleModel.find({click:1}).remove(function(err){
  if(err) {
    console.log(err)
  }else{
    console.log('delete');
  }
  mongoose.connection.close();
})
*/
// 方式二
  ArticleModel.remove({a:'b'}, function(err){
    if(err){
      console.log('err')
    }else{
      console.log('刪除成功');
    }

  mongoose.connection.close();
})
app.js

 

  3.3 更新數據
    ArticleModel.update({id: {$lt:24}}, {$set:{'title': 'xxx'}}, function(err){ });

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/db6');

//文檔結構
var ArticleSchema = new mongoose.Schema({
  title: String,
  content: String,
  author: String,
  date: Date,
  click: Number
});

//創建模型
var ArticleModel = mongoose.model('article', ArticleSchema);

//更新數據
ArticleModel.update({title:'aaa'}, {$set:{author: '明月'}}, function(err){
  if(err){
    console.log(err)
  }else{
    console.log('更新成功');
  }
  mongoose.connection.close();
})
app.js

 

  3.4 獲取數據 ===> 回調函數中可以對data進行更新修改save或刪除remove操作

    獲取單條數據:  ArticleModel.findOne({_id:'5b8788d68711943d60ff923b'}, function(err, doc){ });

      根據唯一主鍵_id查找:ArticleModel.findById('5ab0658ec66711071a6be35a', function(err, data){ })

    獲取多條數據:  ArticleModel.find({id:{$lt:26}}, function(err, data){ })

    統計文檔的數量: UserModel.count({}, function(err, data){ console.log(data); });

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/db6');

//文檔結構
var ArticleSchema = new mongoose.Schema({
  title: String,
  content: String,
  author: String,
  date: Date,
  click: Number
});

//創建模型
var ArticleModel = mongoose.model('article', ArticleSchema);

//獲取單條數據
// ArticleModel.findById('5b8666bc6c6e0fc58352f96a', function(err, doc){
//   console.log(doc);
//   mongoose.connection.close();
// });

// ArticleModel.findOne({}, function(err, data){
//  console.log(data);
//  mongoose.connection.close();
// });

// //多條查詢
// ArticleModel.find({}, function(err, data){
//  console.log(data);
//  mongoose.connection.close();
// });

// //統計
// ArticleModel.count({}, function(err, count){
//  console.log(count);
//  mongoose.connection.close();
// });

//更新
// ArticleModel.findById('5b8666bc6c6e0fc58352f96a', function(err, doc){
// ArticleModel.findOne({_id:'5b8666bc6c6e0fc58352f96a'}, function(err, doc){
 // doc
//  console.log(doc);
//  doc.author = '馬劍';

//  doc.save(function(err){
//    if(err){
//      console.log(err)
//    }else{
//      console.log('更新成功');
//    }
//    mongoose.connection.close();
//  })
// });

//刪除
ArticleModel.findById('5b8666bc6c6e0fc58352f96a', function(err, doc){
 // doc
 doc.remove(function(err){
   if(err){
     console.log(err)
   }else{
     console.log('刪除成功');
   }
   mongoose.connection.close();
 })
});
app.js

  

  3.5 查詢數據
    3.5.1 條件:
      小於: ArticleModel.find({id: {$lt: 24}}, function(err, data){ });
    模糊查詢: ArticleModel.find({title: {$regex: /連衣裙/}}, function(err, data){ });
     邏輯與: ArticleModel.find({title: {$regex: /連衣裙/}, id:{$gt: 1490}}, function(err, data){ });
     邏輯或: ArticleModel.find({$or:[{id:{$gt:1490}}, {title:{$regex:/連衣裙/}}]}, function(err, data){ });
    3.5.2 字段: 限定篩選出來的數據哪些字段是要顯示的
      ArticleModel.find({id:{$lt: 24}}).select({id:1}).exec(function(err, data){ })
    3.5.3 截取: 應用場景主要用於分頁顯示效果
      ArticleModel.find({id:{$lt: 30}}).limit(5).exec(function(err, data){ })
      ArticleModel.find({id:{$lt: 30}}).skip(5).limit(5).exec(function(err, data){ })
    3.5.4 排序:
      ArticleModel.find({id:{$lt: 30}}).sort({id:-1}).exec(function(err, data){ })

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/project');

//定義結構
var GoodsSchema = new mongoose.Schema({
  id: Number,
  title: String,
  price: Number,
  pic: String,
  user_id: Number
});

//創建模型
var GoodsModel = mongoose.model('goods', GoodsSchema);

// 讀取數據  
/*
GoodsModel.find({price: {$lt: 9.9}}, function(err, data){
  if(err){
    console.log(err)
  }else{
    console.log(data);
  }
  mongoose.connection.close();
});
*/

// 讀取數據 模糊查詢
/*
GoodsModel.find({title: {$regex: /顯瘦/}}, function(err, data){
  console.log(data);

  mongoose.connection.close();
});
*/

//字段篩選
/*
GoodsModel.find().select({id:1,_id:0,title:1}).exec(function(err, data){
  console.log(data);
  mongoose.connection.close();
});
*/

//截取數據
/*
GoodsModel.find().limit(5).exec(function(err, data){
  console.log(data);
  mongoose.connection.close();
})

GoodsModel.find().skip(5).limit(5).exec(function(err, data){
  console.log(data);
  mongoose.connection.close();
});
*/
 
//排序   先排序后截取
GoodsModel.find().limit(5).sort({id:1}).exec(function(err,data){
  console.log(data);
  mongoose.connection.close();
});
app.js

 

四. 數據關聯

// 引入數據庫配置模塊
var mongoose = require('../configs/db_config.js');

// 定義 user 數據的 骨架(用來約束 itmes 這個集合的)
var articleSchema = new mongoose.Schema({
    // 關聯欄目
    itemId:{
        type: 'ObjectId',
        // 關聯集合
        ref:'item'
    },
    // 文章標題
    title: String,
    // 作者
    author: String,
})

// 3.創建數據庫模型      (在數據庫里創建集合的時候 會自動幫你變成 復數)
var articleModel = mongoose.model('article', articleSchema);

// 暴露數據庫模型
module.exports = articleModel;
articleModel.js
// 引入數據庫配置模塊
var mongoose = require('../configs/db_config.js');

// 定義 user 數據的 骨架(用來約束 itmes 這個集合的)
var itemSchema = new mongoose.Schema({
    // 欄目名稱
    name: String,
    // 創建時間
    ctime: {
        type:Date,
        default:  new Date()   // 默認值
    },      
    // 欄目的排序
    order:Number,
    // 欄目描述
    description: String      
})

// 3.創建數據庫模型      (在數據庫里創建集合的時候 會自動幫你變成 復數)
var itemModel = mongoose.model('item', itemSchema);

// 暴露數據庫模型
module.exports = itemModel;
itemModel.js
 // populate 去查關聯的集合
 articleModel.find().populate('itemId',{name:1}).exec(function (err, data) {
            console.log(data);
            if (err) {
                console.log('數據添加數據失敗');
            } else {
                // 響應模版 發送數據
                res.render('admin/articleList', { articlelist: data});
            }
        })
router.js

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM