概述

像Mysql和Mongodb这样的数据库,一般都是在命令行或者工具里面进行操作,如果想在node搭建的服务器上面操作,就必须要利用特殊的模块的。其中操作Mongodb数据库需要用到mongoose模块,下面记录我学习mongoose模块的过程,供以后开发时参考,相信对其他人也有用。

参考资料:mongoose文档

准备工作

需要先安装MongDB数据库和Node.js。

然后在npm里面输入如下命令:

//初始化
npm init //安装mongoose依赖
npm install mongoose

连接数据库

如果要操作数据库,肯定需要先连接数据库(并不需要额外在mongdb数据库里面新建,如果node发现不存在这个数据库会自动创建一个,但是需要先启动mongodb服务):

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

然后用node运行getting-started.js即可连接到mongodb数据库。但是上面的代码并没有做任何事,所以我们需要加入如下代码进行操作:

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function (callback) {
console.log('成功连接数据库');
});

用node运行getting-started.js之后会在命令行打印“成功连接数据库”,这就表示,之后所有的操作都必须在那个回调函数里面写。

创建数据库和条目

mongoose里面的三个概念很重要:

  1. schema,对应于mongodb里面的collection(集合),在这里定义键和类型(schematypes)。
  2. model,对应于schemas的一个类,通过它来创建条目。
  3. document,对应于mongodb里面的entry,就是条目。

一般通过下面这个过程创建数据库的条目:

//创建Schema
var personSchema = mongoose.Schema({
name: String,
height: Number
}); //通过Schema创建model,由于是类,所以首字母大写
var PersonModel = mongoose.model('Person', personSchema); //创建document
var tim = new PersonModel({ name: 'Tim', height: 150}); //保存(这是一个异步动作,回调会在同步代码完毕后再运行)
tim.save(function(err, tim) {
console.log(tim.name + '保存成功');
}) //输出tim
console.log(tim);

注意:如果数据库中有Person这个collection,则会自动连接到这个collection,否则会自动创建一个。

schema

对于schema,我们可以对它做三件事:增加或删除键;定义主键;增加方法

我们可以用add方法增加(删除)键:

personSchema.add({ weight: 'number', nickname: 'string' });

可以通过下面的示例感受一下:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test'); var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function(callback) {
console.log('开始进行MongoDB数据库操作'); var personSchema = mongoose.Schema({
name: String,
height: Number
}); var PersonModel = mongoose.model('Person', personSchema); var tim = new PersonModel({ name: 'Tim', height: 150}); personSchema.add({ weight: 'number', nickname: 'string' }); var bim = new PersonModel({ name: 'bim', height: 160, weight: 60}); //输出tim的名字
console.log(tim); //{_id: 5aed9a70595695188446035d, name: 'Tim', height: 150}
console.log(bim); //{_id: 5aed9a70595695188446035e, name: 'Bim', height: 160, weight: 60}
console.log(bim.nickname); //undefined
});

从上面的例子可以看到,没有定义的属性是undefined,并且不会输出。我们还可以看到,有一个默认的属性_id,它是schema的默认主键,如果想修改主键的话,可以用下面的方法:

var personSchema = mongoose.Schema({
id: mongoose.Schema.ObjectId,
name: String,
height: Number
}); var PersonModel = mongoose.model('Person', personSchema); var tim = new PersonModel({ id: new mongoose.Types.ObjectId, name: 'Tim', height: 150});

但是上面只是定义了一个类型为ObjectId的主键而已,它会自动增加,但是它并不是主键。mongodb不允许自定义主键(貌似是这样?),但是可以用虚拟键解决这个问题。

可以通过下面的代码给schema增加方法:

personSchema.methods.speak = function() {
var greeting = this.name ? 'My name is ' + this.name : 'I have not a name';
console.log(greeting);
}
var PersonModel = mongoose.model('Person', personSchema);
var tim = new PersonModel({ name: 'Tim', height: 150});
tim.speak();

model

model是创建条目的类,对于model我们想做这几件事:增删改查

增操作:利用model的create方法。(这个方法会自动保存条目)

PersonModel.create({name: sim}, function(err, person) {
console.log('增加' + person.name);
});

删除操作:利用model的remove方法。

PersonModel.remove({name: Tim}, function(err) {
console.log('删除成功');
});

改操作:有很多种方法,但是所有方法都需要加一个回调函数,不然不会成功

var condition = {name: 'bim'},
query = {$set:{name: 'time', nickname: 'haha'}}; //使用update方法
PersonModel.update(condition, query, function() {
console.log('修改成功');
}); //使用findOneAndUpdate方法
PersonModel.findOneAndUpdate(condition, query, function() {
console.log('修改成功');
});

查操作:利用model的find方法。

PersonModel.find({ name: 'bim' }, function(err, person){
console.log(person[0]);
})

注意:增操作和改操作都是异步的,所以在增操作和改操作之后立即查询是查不到的

document

document就是条目entry,对于document我们想对它做一些处理,比如进行回调等。

这个时候就可以利用exec方法了,实例如下:

var query = PersonModel.findOne({ 'name': 'time' });
query.select('name nickname');
query.exec(function (err, person) {
if (err) return handleError(err);
//输出:time is also called haha.
console.log('%s is also called %s.', person.name, person.nickname)
})

mongoose入门的更多相关文章

  1. mongoose 入门基本操作

    简介 Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具 那么要使用它,首先你得装上node.js和mongodb,关于mongodb的安装和操作介绍可以参考:ht ...

  2. Mongoose 入门以及实现数据的增、删、改、查

    mongoose 介绍 Mongoose 是在 node.js 异步环境下对 mongodb 进行便捷操作的对象模型工具.Mongoose 是 NodeJS 的驱动,不能作为其他语言的驱动. Mong ...

  3. Mongoose学习参考资料

    我们学习node操作mongodb数据库时,可能经常要用到MongoDB 数据库的模型工具Mongoose,下面是我整理的一些学习资料: 番外篇之——使用 Mongoose:https://githu ...

  4. 利用koa实现mongodb数据库的增删改查

    概述 使用koa免不了要操纵数据库,现阶段流行的数据库是mongoDB,所以我研究了一下koa里面mongoDB数据库的增删改查,记录下来,供以后开发时参考,相信对其他人也有用. 源代码请看:我的gi ...

  5. 《JavaScript编程实战》

    <JavaScript编程实战> 基本信息 原书名:JavaScript programming: pushing the limits 作者: (美)Jon Raasch 译者: 吴海星 ...

  6. Nodejs学习笔记(十四)— Mongoose介绍和入门

    目录 简介 mongoose安装 连接字符串 Schema Model 常用数据库操作 插入 更新 删除 条件查询 数量查询 根据_id查询 模糊查询 分页查询 其它操作 写在之后... 简介 Mon ...

  7. Mongoose基础入门

    前面的话 Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具.本文将详细介绍如何使用Mongoose来操作MongoDB NodeJS驱动 在介绍Mongoose之 ...

  8. Nodejs学习笔记(十四)—Mongoose介绍和入门

    简介 Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具 那么要使用它,首先你得装上node.js和mongodb,关于mongodb的安装和操作介绍可以参考:ht ...

  9. Node.js 入门:Express + Mongoose 基础使用

    前言 Express 是基于 Node.js 平台的 web 应用开发框架,在学习了 Node.js 的基础知识后,可以使用 Express 框架来搭建一个 web 应用,实现对数据库的增删查改. 数 ...

随机推荐

  1. hdu--6178(多校

    题意:要在一棵 n 个点的树上放 k 只猴子,然后删掉尽量多的边,使得删边后,每只猴子都至少和另外一只猴子相连,问最后剩下的边数. 思路:其实dfs遍历一次看有多少个点-边-点就好了,比赛的时候就觉得 ...

  2. 又一道区间DP的题 -- P3146 [USACO16OPEN]248

    https://www.luogu.org/problemnew/show/P3146 一道区间dp的题,以区间长度为阶段; 但由于要处理相邻的问题,就变得有点麻烦; 最开始想了一个我知道有漏洞的方程 ...

  3. MyBatis中实现多表查询

    如果查询的数据量大,推荐使用N+1次查询.数据量少使用联合查询... 一. 1.Mybatis是实现多表查询方式 1.1  业务装配:对两个表编写单表查询语句,在业务(Service)把查询的两表结果 ...

  4. 2018.12.17 bzoj3667: Rabin-Miller算法(Pollard-rho)

    传送门 Pollard−rhoPollard-rhoPollard−rho板题. 题意简述:给出几个数,让你判断是不是质数,如果不是质数就求出其最大质因子,数的大小为1e181e181e18以内. 先 ...

  5. 假期训练八(poj-2965递归+枚举,hdu-2149,poj-2368巴什博奕)

    题目一(poj-2965):传送门 思路:递归+枚举,遍历每一种情况,然后找出最小步骤的结果,与poj-1753类似. #include<iostream> #include<cst ...

  6. vue 开发系列(七) 路由配置

    概要 用 Vue.js + vue-router 创建单页应用,是非常简单的.使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将 ...

  7. Mybatis-Plus 实战完整学习笔记(六)------select测试一

    查询方法(3.0.3) 1.查询一个员工的数据 @Test public void selectMethod() throws SQLException { // 根据ID获取一个对象的数据 Empl ...

  8. jQuery length 和 size()区别

    jQuery length和size()区别总结如下: 1.length是属性,size()是方法. 2.如果你只是想获取元素的个数,两者效果一样既 $("img").length ...

  9. js parseInt函数

    在代码中,用到数字的地方,如果是字符串,需要将字符串转化为数字型. 1.使用parseInt(string,radix),将整数类型的字符串变为整型,radix表示以什么样的基数来解析字符串,通常是1 ...

  10. (转)mysql command line client打不开(闪一下消失)的解决办法

    转自:http://www.2cto.com/database/201209/153858.html 网上搜索到的解决办法: 1.找到mysql安装目录下的bin目录路径. 2.打开cmd,进入到bi ...