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

原文地址:https://www.cnblogs.com/xzsz/p/9554770.html