Mongoose简单学习笔记
1.1 名词解释
Schema
: 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力Model
: 由Schema
发布生成的模型,具有抽象属性和行为的数据库操作对Entity
: 由Model
创建的实体,他的操作也会影响数据库
注意:
1.本学习文档采用严格命名方式来区别不同对象,例如:
var PersonSchema; //Person的文本属性
var PersonModel; //Person的数据库模型
var PersonEntity; //Person实体
2.Schema
、Model
、Entity
的关系请牢记,Schema
生成Model
,Model
创造Entity
,Model
和Entity
都可对数据库操作造成影响,但Model
比Entity
更具操作性。
目录[-]
安装Mongoose
$ npm install mongoose
连接数据库
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
定义你的schema
这里的schema相当于模型,但是mongoose里面除了schma外还有一个model的概念。可以先暂时这样理解:我们首先定义schema,然后再由schema生成model,这个时候的model才拥有了与数据库交互的方法。
我们先定义一个博文的schema,如下。
var blogSchema = new Schema({
title: String,
author: String,
body: String,
comments: [{ body: String, date: Date }],
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: {
votes: Number,
favs: Number
}
});
我们传递给mongoose的Schema构造器的对象结构中,key代表我们定义的属性名称,value则是这项属性的类型。目前mongoose允许的几种类型有:
- String
- Number
- Date
- Buffer
- Boolean
- Mixed
- ObjectId
- Array
这些类型中,除了Mixed、ObjectId是Schema.Types的属性外,其它都是javascript自有的属性。
定义完schema之后,我们由它生成model。
var Blog = mongoose.model('Blog', blogSchema);
之后当我们需要初始化一条博文的记录的时候,我们就可以这样初始化:
var blog = new Blog({
title: 'this is my blog title',
author: 'me',
body: 'the body of my blog. can you see that?'
});
数据库操作
定义完模型之后,我们就可以进行记录的增删查改了。mongoose的增删查改十分简单,以我们上一节的Blog模型为例,当我们初始化了一条博文的记录的时候,并没有将它保存进数据库中。这个时候,我们只要调用blog实例的save方法就可以将记录插入数据库中了。
blog.save();
还可以给save方法传递一个错误回调函数,如果保存过程中发生错误将会调用该函数。
另外一种保存记录的方法是使用我们之前定义好的Blog对象,调用它的create方法:
Blog.create({
title: 'another blog title',
author: 'still me',
body: 'the blog body again!'
}, function (err, small) {
if (err) return handleError(err);
// saved!
});
数据库中有了记录,下一步可能就是需要做查询了。例如,查询作者“me”的文章。一种方法是:
Blog.find({ author: 'me' }).exec(callback);
另一种方法是:
Blog.find({ author: 'me'}, callback);
基本上所有涉及到查询的模型方法都有这样两种形式的查询方式,一种是不往查询方法中传递回调函数,这时查询方法不会立即执行查询,而是返回一个query对象,用户可以再在query对象上修改查询条件,直到执行exec(callback)方法;而第二种是往查询方法中传递回调函数,这时查询方法立即执行。
推荐使用前者,因为这样方便指定复杂的条件以及用于链式调用。例如我可以找出这样一篇博文:
Blog
.find({ author: 'me' })
.where('title').equals('this is title')
.where('meta.votes').gt(17).lt(66)
.limit(10)
.sort('-date')
.select('title author body')
.exec(callback);
现在我们插入了数据,并且可以查询了,接下来就是删除一些我们不需要的记录了。代码也还是比较简单:
Blog.remove({ author: 'me' }, function (err) {
if (err) return handleError(err);
// removed!
});
最后就是更新了。在mongoose里,模型的update方法是只做更新,并不会返回对象。如果需要获取要更新的对象,要使用模型的findOneAndUpdate方法。
Blog.update({ author: 'me' }, { title: 'new title' }, { multi: true }, function (err, numberAffected, raw) {
if (err) return handleError(err);
console.log('The number of updated documents was %d', numberAffected);
console.log('The raw response from Mongo was ', raw);
});
至此,mongoose简单的增删查改算是告一段落了,有空再写详细一点的内容。
Mongoose简单学习笔记的更多相关文章
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
- Linux——帮助命令简单学习笔记
Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...
- OI数学 简单学习笔记
基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...
- <<C++标准程序库>>中的STL简单学习笔记
0. 内容为个人学习笔记, 仅供参考, 如有错漏, 欢迎指正! 1. STL中的所有组件都是由模板构成的, 所以其元素可以是任意型别的. 组件有: - 容器: 管理某类对象的集合. 不同的容器有各自的 ...
- Linux——bash应用技巧简单学习笔记
本人是看的lamp兄弟连的视频,学习的知识做一下简单,如有错误尽情拍砖. 命令补齐 命令补齐允许用户输入文件名起始的若干个字 母后,按<Tab>键补齐文件名. 命令历史 命令历史允许用户浏 ...
- Oracle简单学习笔记
创建用户 CREATE USER username identified by password;//这是最简单的用户创建SQL语句. CREATE USER username identified ...
- Linux——软件包简单学习笔记
Linux中的是那种软件包: (这里学习是基于redHat的Cent-OS) 1: 二进制软件包管理(RPM.YUM) 2:源代码包安装 3: 脚本安装(Shell或Java脚本) 一: 二进制软件 ...
- Linux——vim/vi 简单学习笔记
Vim/Vi是一个功能强大的全屏幕文本编辑器,是Linux/UNIX上最常用的文本编辑器,它的作用是建立.编辑.显示文本文件.Vim/Vi 没有菜单,只有命令. 早前也用过Vim变过C++/C的代码, ...
- OI动态规划&&优化 简单学习笔记
持续更新!! DP的难点主要分为两类,一类以状态设计为难点,一类以转移的优化为难点. DP的类型 序列DP [例题]BZOJ2298 problem a 数位DP 常用来统计或者查找一个区间满足条件的 ...
随机推荐
- Swift - 开源框架总结
苹果官方Swift文档<The Swift Programming Language> 苹果开发者Swift文档及介绍 网友整理的Swift中文文档< Apple Swift编程语言 ...
- PHP面向对象——异常处理
Error_reporting(0); //在网站正式上线的时候不准他报任何错误. 错误级别为不允许报错 Exception 是所有异常的基类. 测试并捕捉一个错误的例子: class mysq ...
- C#的扩展方法
using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...
- sdut 2125串结构练习--字符串匹配【两种KMP算法】
串结构练习——字符串匹配 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目链接:http://acm.sdut.edu.cn/sduto ...
- Solr入门之(8)中文分词器配置
Solr中虽然提供了一个中文分词器,但是效果很差,可以使用IKAnalyzer或Mmseg4j 或其他中文分词器. 一.IKAnalyzer分词器配置: 1.下载IKAnalyzer(IKAnalyz ...
- Shell脚本获取C语言可执行程序返回值
#!/bin/sh #./test是c程序,该程序 返回0 ./test OP_MODE=$? echo $OP_MODE # $? 显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误.
- Unity3d 提示 "The scripts file name does not match the name of the class defined in the script!"的解决办法
有两个原因,一个是文件的名称和类名不一致 第二个原因是有命名空间, 排除应该是可以修复的
- 数据库字典 sql
SELECT 表名=case when a.colorder=1 then d.name else '' end, 表说明=case when a.colorder=1 then isnull(f.v ...
- apk 打包方式
1 项目-->Android tools -->Export Signed Application Package 2 在项目 manifest.xml文件下 单击“use the Ex ...
- barabasilab-networkScience学习笔记3-随机网络模型
第一次接触复杂性科学是在一本叫think complexity的书上,Allen博士很好的讲述了数据结构与复杂性科学,barabasi是一个知名的复杂性网络科学家,barabasilab则是他所主导的 ...