当前位置: 首页 > 编程日记 > 正文

koa+mongoose基础入门

1.mongoose基本使用

1.安装mongodb

npm install mongodb

2.引入mongodb数据表,连接mongodb,通过node来对mongodb进行异步的增删改查

const mongodb = requrie('mongodb');
mongodb.MongoClient.connect("mongodb://localhost/db1", function(err,db){if(!err){db.connection("col").insert({"a": 1}), function(err, res){if(!err){console.log(result);}}}
}
复制代码

以上代码,在mongodb数据库中建立了db1数据库,然后建立了col集合,并插入{"a":1}文档

可以看出不是很好使用,所以使用mongoose简化操作

3.什么是mongoose

mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具。

有两个特点:

1.通过关系型数据库的思想来设计非关系型数据库

2.基于mongodb驱动,简化操作

mongoose有三个重要概念,分别是Schema,Model,Entity。

它们的关系是:Schema生成Model,Model创造Document,Model和Document都可对数据库操作造成影响,但Model比Document更具操作性。

4.安装mongoose和连接数据库

1.安装

npm install mongoose

2.引入mongoose

import mongoose from 'mongoose'

或者

const mongoose = require('mongoose')

3.使用connect()方法连接到mongodb数据库

1.连接到本地的db1服务器

mongoose.connect('mongodb://localhost/db1');
复制代码

2.以用户名"u1",密码"123456"登录'db1'数据库

mongooge.connect('mongodb://ul:123456@localhost/db1', function(err){if(err){console.log('连接失败')}else{console.log('连接成功')}
})
复制代码

3.断开连接

mongoose.disconnect()
复制代码

5.一些概念

1.Schema

1.Schema主要用于定义MongoDB中集合Collection里文档document的结构

支持的类型有:String,Number,Date,Buffer(二进制),Boolean,Mixed(混合类型),ObjectId(对象ID),Array

2.新建Schema对象

import mongoose from 'mongoose';
const Schema = mongoose.Schema;const mySchema = new Schema({title: String,comments: [{body: String,date: Date}],date: {type: Date,default: Date.now}
})
复制代码

3._id

每一个文档document都会被mongoose添加一个不重复的_id,_id的数据类型不是字符串,而是ObjectID类型。如果在查询语句中要使用_id,则需要使用findById语句,而不能使用find或findOne语句

2.Model

1.模型Model是根据Schema编译出的构造器,同Model可以实例化出文档对象document

2.使用model()

const schema = new mongoose.Schema({num: Number,name: String,size: String
});
const myModel = mongoose.model('myModel', schema);
复制代码

3.实例化文档document

const doc1 = new myModel({size: 'small'});
复制代码

4.文档保存 通过new myModel()创建的文档doc1,必须通过save()方法,才能将创建的文档保存到数据库的集合中,集合名词为模型名称的小写复数版

doc1.save(function(err, doc){console.log(doc);
})
复制代码

6.常用API

model-文档操作

Model.find(query, [fields, options,] callback)

1.返回所有集合文档

忽略第一个参数,或为空对象 model.find({}, callback)

2.过滤查询

修改第二个参数,返回结果包含name,不包含age,_id默认为1

model.find({}, {'name':1,'age':0}, callback)

3.限制返回结果数量

第三个参数,游标操作limit限制返回结果数量为20个,不足20个则返回所有 model.find({}, null, {limit:20});

4.查询找到的第一个文档

model.findOne({}, callback);

5.根据_id查询

model.findById('obj_id', callback)

1.model.create(文档数据,callback)

const doc =({title: "mongoose",author: "chen"
});
blogModel.create(doc, function(err, docs){
});
复制代码

2.model.save([options],[options.safe],[options.validateBeforeSave],[fn])

const blogEntity = new blogModel({title: "mongoose",author: "chen"
});
blogEntity.save(function(err,docs){
});
复制代码

3.model.insertMany(doc(s),[options],[callback]) 将多条数据库一次性插入 blogModel.insertMany([ {title: 'mongoose1', author: 'chen1'}, {title: 'mongoose2', author: 'chen2'} ],function(err, docs){ } ])

model.update(查询条件,更新对象,可以使用mongodb的更新修改器) model.update(conditions, update, callback)

options控制选项:

safe:默认为true,安全模式

upsert:默认为false,不存在就创建新纪录

multi:默认为false,是否更新多个查询记录

runValidators:如果为true,执行Validation验证

setDefaultsOnInsert:如果upsert为true,在新建时插入文档定义的默认值

strict:以strict模式进行更新

overwrite:默认为false,禁用update-only模式,允许覆盖记录

blogModel.update({title:"mongoose"},{author:"miao"},{multi:true},function(err,docs){})
复制代码

model.remove(查询条件,回调函数) model.remove(conditions, callback)

2.nuxt+koa+mongoose中的实际使用

1.首先配置数据库

server/dbs/config.js

export default{dbs: 'mongodb://127.0.0.1:27017/student'
}
复制代码

2.编写数据表模型

server/dbs/models/address.js

import mongoose from 'mongoose'
const Schema = mongoose.Schema
const AddressSchema = new Schema({user: {type: String,required: true},name: {type: String,required: true},gender: {type: Number,required: true},tel: {type: String,required: true},address: {type: String,required: true},houseNum: {type: String,required: true},type: {type: Number},del: {type: Boolean}
})
export default mongoose.model('Address', AddressSchema)
复制代码

3.编写接口

server/interface/address.js

import Router from 'koa-router';
import Address from '../dbs/models/address';// 定义路由前缀
let router = new Router({prefix: '/address'
})
// 新增收货地址
router.post('/add', async (ctx) => {if(!ctx.isAuthenticated()){ctx.body = {code: -1,msg: 'please login'}}else{const {name,gender,tel,address,houseNum,type} = ctx.request.body;let naddress = new Address({user: ctx.session.passport.user,name,gender,tel,address,houseNum,type,del: false})let result = await naddress.save()if(result){ctx.body = {code: 0,msg: 'success'}}else{ctx.body ={code: -1,msg: 'fail'}}}
})
// 修改收货地址
router.post('/edit', async (ctx) => {if(!ctx.isAuthenticated()){ctx.body = {code: 1,msg: 'please login'}}else{const {name,gender,tel,address,houseNum,type} = ctx.request.body;try{let result = await Address.update({'_id': id},{name,gender,tel,address,houseNum,type})ctx.body = {code: 0,msg: result}}catch(e){ctx.body ={code: -1,msg: 'fail'}}}
})// 删除地址
// 这里没有真的删除,而是改变了del的值
router.get('/del', async (ctx) => {if(!ctx.isAuthenticated()){ctx.body = {code: 1,msg: 'please login'}}else{let {id} = ctx.query;try{let result = await Address.update({'_id': id}, {'del': true})ctx.body = {code: 0,msg: result}}catch(e){ctx.body = {code: -1,msg: 'fail'}}}
})
// 获取单个地址
router.get('/getOne', async ctx => {if(!ctx.isAuthenticated()){ctx.body = {code: -1,msg: 'please login'}}else{let id = ctx.query.id;try {let result = await Address.findOne({'_id': id,'del':false})ctx.body = {code: 0,data: result}}catch(e){ctx.body = {code: -1,data: {}}}}
})// 获取该用户所有地址
router.get('/getAll', async ctx => {if(!ctx.isAuthenticated()){ctx.body = {code: -1,msg: 'please login'}}else{try {let result = await Address.find({'user': ctx.session.passport.user,'del':false})ctx.body = {code: 0,data: result}}catch(e){ctx.body = {code: -1,data: {}}}}
})export default router
复制代码

4.引入接口

server/index.js

import mongoose from 'mongoose'
import dbConfig from './dbs/config'
import address from './interface/address'// 连接数据库
mongoose.connect(dbConfig.dbs, {useNewUrlParser: true
})// 引入路由
app.use(address.routes()).use(address.allowedMethods())
复制代码

相关文章:

视觉SLAM学习(三)--------SLAM 综述

SLAM概述 参考资料分享来自本人博客:https://blog.csdn.net/Darlingqiang/article/details/78840931 SLAM一般处理流程包括track和map两部分。所谓的track是用来估计相机的位姿,也叫front-end。而map部分(back-end)则是深度的构建,通过前面…

【数据结构】所有顶点对的最短路径 Floyd算法

所有顶点对的最短路径问题是指&#xff1a;对于给定的有向图G(V&#xff0c;E),求任意一对顶点之间的最短路径。 可以求解得到的 的递推公式&#xff1a; #include <stdio.h> #include <stdlib.h> const int FINITY 5000; const int M 20; typedef struct {ch…

backbone学习总结(二)

今天来看下backbone的路由控制的功能。其实个人感觉backbone&#xff0c;模块就那么几个&#xff0c;熟悉它的框架结构&#xff0c;以及组成&#xff0c;就差不多。 废话不多说&#xff0c;我们来看看还剩下的功能。 关于路由和历史管理 通过 Backbone.Router.extend 来创建路由…

人工智能--野人过河

课程简介 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能的定义可以分为两部分&#xff0c;即“人工”和“智能”。“人工”比较好…

java对cookie的操作

原文&#xff1a;http://www.cnblogs.com/muzongyan/archive/2010/08/30/1812552.html java对cookie的操作比较简单&#xff0c;主要介绍下建立cookie和读取cookie&#xff0c;以及如何设定cookie的生命周期和cookie的路径问题。 建立一个无生命周期的cookie&#xff0c;即随着…

【ACM】POJ 3069

【问题描述】 Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep track of his forces, Saruman distributes seeing stones, known as palantirs, among the troops. Each palantir has a maximum effective range of R u…

sparkCore源码解析之思维脑图

2019独角兽企业重金招聘Python工程师标准>>> 在学习sparkCore时&#xff0c;有几个模块的概念理解不是很透彻&#xff0c;故对照源码进行学习&#xff0c;并将结果一脑图的形式呈现&#xff0c;方便后续的持续学习。 详细内容见&#xff1a; sparkCore源码解析之blo…

pangilin 安装编译

make pangolin 的时候报错 ootsun:/home/sun/AR/orb/Pangolin-0.5/build# make [ 1%] Building CXX object src/CMakeFiles/pangolin.dir/log/packetstream.cpp.o /home/sun/AR/orb/Pangolin-0.5/src/log/packetstream.cpp: 在函数‘void pangolin::WaitUntilPlaybackTim…

PHP实现求阶乘

function factorial ($x){if ($x > 1) {$s $x * factorial ($x - 1);} else {$s $x;}return $s; }$x 100;echo $x."的阶乘的为".factorial($x);转载于:https://blog.51cto.com/chensenlin/1854679

【ACM】杭电OJ 2064(汉诺塔III)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2064 思路&#xff1a; 1、将n-1个盘从A移到C f(n-1)次 2、将第n个从A移到B 1次 3、将n-1个盘从C移到A f(n-1)次 4、将第n个从B移到C 1次 5、将n-1个盘从A移到C f(n-1)次 #include<cstdio> #inclu…

文件上传至阿里云

public static String uploadFile2OSS(InputStream instream, String fileName) throws IOException {String imageName null;OSSClient ossClient null;try {ClientConfiguration conf new ClientConfiguration();// 请求超时时间设置conf.setConnectionTimeout(5000);// 请…

ORB-SLAM2安装

安装顺利与否可能会与Ubuntu版本有关。&#xff08;ubuntu16.04 gcc4.8.5这个很重要偶&#xff0c;本班的直接决定Pangolin能不能安装成功&#xff0c;如果遇到哦问题的朋友可以参考一下链接 http://blog.csdn.net/Darlingqiang/article/details/78928873&#xff09;亲测可用…

iOS 系统分析(一) 阅读内核准备知识

原文出自【听云技术博客】&#xff1a;http://blog.tingyun.com/web/a... 0x01 iOS体系架构1.1 iOS 系统的整体体系架构 用户体验( The User Experience layer )&#xff1a;SpringBoard 同时支持 Spotlight。 应用软件开发框架&#xff08;The Application Frameworks layer&a…

【数据结构】拓扑排序

如果一个有向图中没有包含简单的回路&#xff0c;这样的图为有向无环图。 图中的顶点代表事件&#xff08;活动&#xff09;&#xff0c;图中的有向边说明了事件之间的先后关系。这种用顶点表示活动&#xff0c;用弧表示活动时间的优先关系的有向图称为顶点表示活动的网&#…

Java8自定义条件让集合分组

** 将一个指定类型对象的集合按照自定义的一个操作分组&#xff1b; 每组对应一个List、最终返回结果类型是:List<List<T>> param <T>*/static class GroupToList<T> implements Collector<T, List<List<T>>, List<List<T>&g…

ROS_Kinetic ubuntu 16.04

ROS_Kinetic系列学习(一)&#xff0c;在ubuntu 16.04安装ROS Kinetic。 http://wiki.ros.org/kinetic/Installation/Ubuntu 通过网页快速了解Linux&#xff08;Ubuntu&#xff09;和ROS机器人操作系统&#xff0c;请参考实验楼在线系统如下&#xff1a; 纯净定制版镜像已经…

android 获取手机GSM/CDMA信号信息,并获得基站信息

本文转自&#xff1a;http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/ 在Android中我们常用的轻松获取WIFI信号列表&#xff0c;那如何获取CDMA或者GSM的手机信号呢&#xff1f;系统提供了TelephonyManager类&#xff0c;此类非常丰富&#xff0c;基本你所…

【数据结构】关键路径

在有向图中&#xff0c;如果用顶点表示事件&#xff0c;弧表示活动&#xff0c;弧上的权值表示活动持续的时间&#xff0c;这样的活动称为边表示活动的网&#xff0c;简称AOE网&#xff08;Activity On Edge&#xff09;。通常可以用AOE网来估算工程的完成时间&#xff0c;他不…

呼伦湖国家级自然保护区管理局投放草料保野生黄羊过冬

图为保护区工作人员正在观测黄羊的生活轨迹并记录数据。 王艳清 摄 图为保护区工作人员正在观测黄羊的生活轨迹并记录数据。 王艳清 摄 中新网呼伦贝尔1月16日电 (记者 李爱平)中国北方正是最为寒冷的时节&#xff0c;呼伦湖国家级自然保护区管理局内的60只野生黄羊正在面临食草…

buildroot httpd php

/********************************************************************* buildroot httpd php* 说明&#xff1a;* 在buildroot中选择了php&#xff0c;但是在测试的时候发现总是出现下面这行* 错误&#xff0c;库是存在的&#xff0c;但是却没有放对…

VS快速注释多行 以及 取消

快速注释多行&#xff1a;Ctrl K 然后 Ctrl C 快速取消多行注释 &#xff1a;Ctrl K 然后 Ctrl U

前端的一些小的效果

1 . 移动端字体自适应大小&#xff08;暂时没用过&#xff0c;不过据说很有用也很好用&#xff09; body{font-family: "Microsoft YaHei";font-size: 0.14rem;color: #666;max-width: 640px;margin: auto;}media screen and (min-width: 360px) { html {font-s…

Java虚拟机规范阅读(二)IEEE754简介以及Java虚拟机中的浮点算法

什么是浮点数在计算机系统的发展过程中&#xff0c;曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数&#xff08;Fixed Point Number&#xff09;。在这种表达方式中&#xff0c;小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式&#…

【ACM】杭电OJ 5055(Bob and math problem)

http://acm.hdu.edu.cn/showproblem.php?pid5055 注意几点&#xff1a; 1、全部都是偶数&#xff0c;输出-1 2、n-1个是0&#xff0c;第n个不论是奇数&#xff0c;还是偶数&#xff0c;输出-1 3、n1的情况 4、将所有数字从大到小排列&#xff0c;挑出最小的奇数放在最后…

每天工作4小时的程序员【转】

每个人都熟悉这种作息规律&#xff1a;早上9点去上班&#xff0c;坐在电脑前面&#xff0c;编一天的程序&#xff0c;下午5点下班回家。如今&#xff0c;非常感谢蒂莫西费里斯 (Timothy Ferriss)的《每周工作4小时》&#xff0c;我开始重新思考应该如何工作&#xff0c;如何让自…

ARKIT/ARCore对比分析(一)

ARKit简介 ARkit是什么&#xff1f; 苹果为什么发布ARkit&#xff1f;&#xff08;6月5日的苹果WWDC 2017全球开发者大会上&#xff0c;苹果发布了AR开发平台ARkit&#xff09; 1.概述&#xff1a;ARkit应用平台是苹果的首个 AR 产品。iOS 11引入了ARKit应用平台&#xff0c;…

每个程序员必看:如何在40岁后继续做软件开发?

导读: 这是一个 42 岁的开发者所写经验分享文章&#xff0e;并且列出一些他 18 年多身为软件开发者的经验谈&#xff0e;许多部分看完后都会希望自己当时就能够了解&#xff0c;所以很推荐不论是新手或是老手都要好好阅读这一篇文章。 故事很长&#xff0c;一切从 1997 年开始讲…

【ACM】杭电OJ 1009 (FatMouse' Trade)。

两个条件貌似缺一不可 不明白为什么不能是sum&#xff08;s[i].value*s[i].cat_food&#xff09;&#xff1b; #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std;const int maxn 1010;typedef …

Java图形化:布局方式

布局方式 FlowLayout:流布局 BorderLayout:边框布局 GridLayout:网格布局FlowLayout&#xff08;流布局&#xff09; 像Word打字&#xff0c;组件从左向右排列&#xff0c;一列排满后自动换下一行。组件默认居中对齐&#xff0c;可以设置左/右对齐。流布局会维持组件的原始大小…

ARKIT/ARCore对比分析(二)

ARKit(2) ARCore 和 ARKit平台特点比对 曾与一家最大的 IMU OEM 交谈过&#xff0c;为了节省成本&#xff0c;他们的智能机IMU 在工厂中只是在单一温度下进行标定。这意味着 IMU 硬件在某一指定的温度下&#xff0c;误差被调节到最低。但当手机发热的时候&#xff0c;IMU 就不…