Practical Node.js (2018版) 第7章:Boosting Node.js and Mongoose

参考:(mongoose和mongodb模块的区别)https://www.jianshu.com/p/87bcf4fdb479

参考: mongoose官网(https://mongoosejs.com/docs/models.html)

参考: 英文:Boosting Node.js和MongoDB with Mongoose


简介:mongoose

Mongoose is a fully developed object document mapping (ODM) library for Node.js and MongoDB.

ODM的概念对应sql的ORM,就是ruby on rails中的activerecord那因层。

activerecord包括migrations, Validations, associations, Query interface, 对应mvc框架中的Models。

ORM, Object-Relational Mappiing。

ODM的作用,定义数据库的数据格式schema, 然后通过它取数据,把数据库中的document映射成程序中的一个对象。这个对象有save, update的系列方法,有tilte, author等系列属性。

在调用这些方法时,odm会根据你调用时使用的条件,转化成mongoDb Shell语言,帮你发送出去。

自然,在程序内使用链式调用,比手写数据库语句更灵活也方便。

例子:

//先安装好MongoDb和Node.js
$ npm install mongoose

// getting-started.js
var mongoose = require(‘mongoose‘);
mongoose.connect(‘mongodb://localhost:27017/test‘);

db.on(‘error‘, console.error.bind(console, "connection error"))

db.once(‘open‘, function() {
  //当连接成功后,写Schema, model, 写实例并保存到数据库。
})

在db.once内的例子1

var userSchema = new mongoose.Schema({
  user: {
    username: String,
    password:  String
  }
})

var User = mongoose.model(‘user‘, userSchema)
var frank = new User({
  user: {
    username: ‘Frank‘,
    password: ‘123456‘
  }
})

frank.save((err, frank) => {
  console.log(‘save success!‘)
  console.log(frank.user)
})

在db.once()的例子2

  //构建一个Schema
  var kittySchema = new mongoose.Schema({
    name: String
  });
  // 写一个方法
  kittySchema.methods.speak = function () {
    var greeting = this.name
      ? "Meow name is " + this.name
      : "I don‘t have a name";
    console.log(greeting);
  }
  // 生成一个model
  var Kitten = mongoose.model(‘Kitten‘, kittySchema);
  // 实例化一个对象
  var fluffy = new Kitten({ name: ‘fluffy‘ });
  // 通过mongoose写入数据库
  fluffy.save((err, fluffy) => {
    if (err) {
      return console.error(err)
    }
    fluffy.speak()
  })

??:此时已经将fluffy对象保存到mongodb://localhost:27017/test的Kitten model内。

即将一个document,保存到test数据库的kittens collection中。

model自动创建了kittens这个collection。(自动添加了s)

??注意:此时mongoDb还没有创建kittens

在创建一个实例并执行save方法,test数据库才会创建了kittens collections和documents。

可以对比使用node.js mongodb driver的代码。

var MongoClient = require(‘mongodb‘).MongoClient,
    assert=require(‘assert‘);
var url = ‘mongodb://localhost:27017/myproject‘;
MongoClient.connect(url,function(err,db){
    assert.equal(null,err);
    console.log("成功连接到服务器");
    insertDocuments(db,function(){
        db.close();
    });
   // db.close();
});
var insertDocuments = function(db,callback){
    var collection = db.collection(‘documents‘);
    collection.insertMany([
        {a:1},
        {a:2},
        {a:3}
    ],function(err,result){
        assert.equal(err,null);
        assert.equal(3,result.result.n);
        assert.equal(3,result.ops.length);
        console.log("成功插入3个文档到集合!");
        callback(result);
    });
} 

上面代码是专为Node.js提供的驱动程序代码和mongDB shell语言类似。

而,用mongoose定位于使用关系型的数据结构schema,来构造你的app data。

它包括内置的类型构件, 验证, 查询,业务逻辑勾子和更多的功能,开箱即用out of the box!

mongoose把你使用Node.js驱动代码自己写复杂的验证,和逻辑业务的麻烦,简单化了。

mongoose建立在MongoDB driver之上,让程序员可以model 化数据。

二者各有优缺点:

mongoose需要一段时间的学习和理解。在处理某些特别复杂的schema时,会遇到一些限制。

但直接使用Node.js的驱动代码,在你进行数据验证时会写大量的代码,而且会忽视一些安全问题。



Practical Node.js (2018版) 第7章:Boosting Node.js and Mongoose

原文地址:https://www.cnblogs.com/chentianwei/p/10297827.html

时间: 2024-10-25 21:02:34

Practical Node.js (2018版) 第7章:Boosting Node.js and Mongoose的相关文章

Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongskin。

Persistence with MongoDB and Mongoskin https://github.com/azat-co/practicalnode/blob/master/chapter5/chapter5.md 学习mongodb的官方网站: https://docs.mongodb.com/manual/tutorial/getting-started/ 我真的喜欢使用MongoDB with Node.因为这个数据库有JavaScript interface, 并使用JSON-

Node入门教程(6)第五章:node 模块化(上)模块化演进

node 模块化 JS 诞生的时候,仅仅是为了实现网页表单的本地校验和简单的 dom 操作处理.所以并没有模块化的规范设计. 项目小的时候,我们可以通过命名空间.局部作用域.自执行函数等手段实现变量不冲突.但是到了大一点的项目,各种组件,各种第三方插件和各种 js 脚步融合的时候,就会发现这些技巧远远不够. 模块化的演变 为什么要有 JS 模块化呢?在浏览器中,顶层作用域的变量是全局的,所以项目稍微复杂点,如果引用的 js 非常多的时候,很容易造成命名冲突,然后造成很大意想不到的结果. 为了避免

Practical Node.js (2018版) 14章, async code in Node

Asynchronous Code in Node 历史上,Node开发者只能用回调和事件emitters. 现在可以使用一些异步的语法: async module Promises Async/await funcitons 原文地址:https://www.cnblogs.com/chentianwei/p/10351476.html

node.js入门经典 第2章 npm(Node包管理器)

2.1 npm是什么 npm(Node Package Manager)是Node.js的包管理器.它允许开发人员在Node.js应用程序中创建.共享并重用模块. 2.3 安装模块 npm install [module_name] 2.4 使用模块 var module = require{'module'}; 2.8  使用package.json指定依赖关系 使用package.json文件来指定在应用程序中要用的模块,并且通过单个命令来安装它们: npm install

NodeJs>------->>第三章:Node.js基础知识

第三章:Node.js基础知识 一:Node.js中的控制台 1:console.log.console.info  方法 1 console.log("this is a test string."); 1 node app1.js 1> info.log 1 console.log("This is a test String ."); 2 3 //从第二个参数开始,依序输出所有的字符串 4 console.log("%s","

NodeJs>------->>第二章:Node.js中交互式运行环境--------REL

第二章:Node.js中交互式运行环境--------REL 一:REPL运行环境概述 1 C:\Users\junliu>node 2 > foo = 'bar' ; 3 'bar' 4 > 二:在REPL运行环境中操作变量 1 C:\Users\junliu>node 2 > foo='bar' 3 'bar' 4 > var foo='bar' 5 undefined 6 > 1 console.log("foo='bar'"); //控

NodeJs>------->>第一章:Node.js介绍

一:章节前言 二:Node.js概述 1:使用node.js能够解决什么问题 2:实现高性能服务器 3:非阻塞型I/O及事件环形机制 4:node.js适合开发的程序 三:node.js安装 一.Node.js 安装配置 Node.js 提供在Windows和Linux上安装, 本文将以Windows上Node最新版本v6.9.3为例来学习,不足之处还望指正: 1.  Window 上安装Node.js 32 位安装包下载地址 : https://nodejs.org/dist/v6.9.3/n

Node.js学习之(第二章:exports和module.exports)

前言 Node中,每个模块都有一个exports接口对象,我们需要把公共的方法或者字符串挂载在这个接口对象中,其他的模块才可以使用. Node.js中只有模块作用域,默认两个模块之间的变量,方法互不冲突,互不影响,这样就导致一个问题,我们怎样使用加载进来的模块中的方法呢?这就需要在另外一个模块exports接口对象中挂载模块中公共的方法. exports 我们在a.js中有以下代码: let foo = 'hello' function add (x, y) { return x+y } exp

js高级程序设计第三版---1~3章

DOM并不只是会对js的,很多其它语言也实现了DOM,但DOM已经是js的一个重要组成部分. BOM是js实现的一部分,但是没有相关的标准,所以每个浏览器都有自己的实现,这个问题在HTML5中得到了解决. 1.<script>的属性: async(异步加载):表示立即下载脚本,不会影响页面中的其它操作,只对外部脚本有效.<script async="async" type="text/javascript"</script> chars