这些模块可以将日志存储在不同格式或级别的文件中。我们将使用流行的ORM Mongoose 讨论 Node.js Express 程序中的 API 日志记录。...那么如何创建一个 Mongoose 插件,以更清洁的方式为你进行记录并简化 API 日志? Mongoose 中的插件是什么? 在 Mongoose 中,模式是可插入的。...这是我们的模型:models/log.js const mongoose = require('mongoose') const Schema = mongoose.Schema const { ObjectId..., base) { return _.transform(object, (result, value, key) => { if (!...它将 document 转换为 Object()和transform:false是为了不允许转换返回对象。
在 mongoose 中有效的 SchemaTypes 有: String Number Date Buffer Boolean Mixed ObjectId Array Decimal128 Map...get: 函数,使用 Object.defineProperty() 定义自定义 getter set: 函数,使用 Object.defineProperty() 定义自定义 setter alias...它们的实例就代表着可以从数据库保存和读取的 documents。从数据库创建和读取 document 的所有操作都是通过 model 进行的。...mul将字段值乘以指定数量unset删除指定字段,数组中的值删后改为 null。...ObjectId、Number、String 以及 Buffer 都可以作为 refs 使用。但是最好还是使用 ObjectId。
default: 任何值或函数 设置此路径默认值,如果是函数m,函数返回值为默认值 select: 布尔值 指定query的默认projections validate: 函数校验 get:函数,使用Object.defineProperty...mongoose.connect(uri,{keepAlive:120}) 五、models-模型 Models 是从 Schema 编译来的构造函数。...它们的实例就代表着可以从数据库保存和读取的 documents。 从数据库创建和读取 document 的所有操作都是通过 model 进行的。...Schema({ _id:Schema.types.ObjectId, name:String, age:Number, stories:[{type:Schema.types.ObjectId...model 中的 document 的 _id 保存 refs 保存 refs 与保存普通属性一样,把_id的值赋给他就好了 const author = new Person({ _id:new mongoose.Types.objectId
在迷你全栈电商应用实战系列的第二篇教程中,我们将通过基于 Node.js 平台的 Express[1] 框架实现后端 API 数据接口,并且将数据存储在 MongoDB[2] 中。...MongoDB 可以从其官网[8]上下载。...然后回到我们之前开启的终端,安装 Mongoose 这个 npm 包: $ npm install mongoose Mongoose 是 MongoDB 最流行的 ODM(Object Document...Mapping,对象文档映射),使用起来要比底层的 MongoDB Node 驱动更方便。...(mongoose); const ObjectId = mongoose.Schema.Types.ObjectId; const productSchema = Schema({ id: ObjectId
关于orm和odm: ORM:Object Relational Mapping,对象关系映射 ODM:Object Document Mapping,对象文档映射 其实两者知识技术名词上的区别,...先学习以下Mongoose的基本用法 将Mongoose集成到项目中 npm install --save mongoose 连接数据库 var mongoose = require('mongoose...在articleSchema中增加一个字段_user,类型为Schema.Types.ObjectId,关联User: _user: { type: Schema.Types.ObjectId,...而Mongoose的解决方法是在数据库的定义时就可以将这些信息定义好。这可能也就是约定优于配置(convention over configuration)的好处吧!...定义时间戳,很简单,在new Schema()的时候,将时间戳的定义当作第二个参数传入即可: new Schema({xxx: xxx}, {timestamps: {createdAt: 'created_at
var ObjectId = mongoose.Schema.Types.ObjectId; var StudentSchema = new Schema({}); //默认会有_id:ObjectId...var TeacherSchema = new Schema({id:ObjectId});//只有id:ObjectId 该类型的值由系统自己生成,从某种意义上几乎不会重复,生成过程比较复杂...将2个Document的嵌套叫做Sub-Docs(子文档) 简单的说就是一个Document嵌套另外一个Document或者Documents: var ChildSchema1 = new...因为query的操作始终返回自身,我们可以采用更形象的链式写法 Person .find({ occupation: /host/ }) .where('name.last....); schema.pre('save',function(next){ //做点什么 next(); }); 8.2.2 Parallel并行 并行提供更细粒度的操作
Node原生的MongoDB驱动更容易 #使用Mongoose 下载安装mongoose模块 cnpm install mongoose --save 引用mongoose: var mongoose...集合 —— 由一组文档组成,如果将MongoDB中的一个文档比喻成关系型数据库中的一行,那么一个集合就相当于一张表。...mongoose中任何任何事物都是从Schema开始的。每一个Schema对应MongoDB中的一个集合(collection)。Schema中定义了集合中文档(document)的样式。...{ name: String, sex: String, age: Number }); 基本属性类型有: String Number Date Boolean Buffer ObjectId...personModel.find({}, {name: 1, _id: 0, age: 1}, {skip: 0, limit: 2}, (err, data)=>{ //只显示name 和 age 从第
5、如果启动失败,证明上边的操作有误,在控制台输入 sc delete MongoDB 删除之前配置的服务,然后从第一步再来一次。...name:"孙悟空", tech_ids: [ ObjectId("59c4806d241d8d36a1d50de4"), ObjectId...比 Node 原生的 MongoDB 驱动更容易 4.3 新的对象 mongoose 中为我们提供了几个新的对象: Schema(模式对象) • Schema 对象定义约束了数据库中的文档结构。...(modelName, schema): // modelName 就是要映射的集合名称,mongoose 会自动将集合名称变成复数。...(modelName, schema): // modelName 就是要映射的集合名称,mongoose 会自动将集合名称变成复数。
然后将文件信息存储在 fs.files 集合的唯一一份文档中。其中 fs.chunks 集合中多个文档中的 file_id 字段对应 fs.files 集中文档”_id”字段。...每在 GridFS 存储一个文件,GridFS 就会将文件内容按照 chunksize 大小(chunk 容量为 256k)分成多个文件块,然后将文件块按照类 json 格式存在.chunks 集合中,...以下是一个 nodejs 版本的代码: const mongoose = require('mongoose') const fs = require('fs') const Promise = require...('bluebird') const { isString } = require('lodash') const ObjectId = mongoose.Types.ObjectId let bucket...我们从创新性和应用价值的维度进行评选,评出本次案例征集活动最佳创新案例和优秀应用案例。
使用mongoose连接数据库 step1 下载mongoose npm install mongoose --save step2 连接mongodb数据库 修改goods.js如下: var express...('Good', productScheme); step2 从goods查找数据并返回 修改goods.js文件如下: var express = require('express'); var router...step1 配置接口代理地址 将'/api/'接口转发到'http://localhost:3000/'。...changeOrign: true, pathRewrite: { '/api': '' } } }, ... } step2 将mock...请求修改为api请求 修改GoodsList.vue文件的getPrdList方法如下: getPrdList () { queryPrdObj = Object.assign(queryPrdObj
调用实例对象下的save方法将数据保存到数据库中。...使用ID将文章集合和作者集合进行关联 author: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } })); //联合查询 Post.find...实现路由功能 呈现用户列表页面 从数据库中查询用户信息 将用户信息展示在列表中 将用户信息和表格HTML进行拼接并将拼接结果响应回客户端 当用户访问/add时,呈现表单页面...当用户访问/modify时,呈现修改页面,并实现修改用户信息功能 修改用户信息分为两大步骤 1.增加页面路由 呈现页面 1.在点击修改按钮的时候 将用户ID传递到当前页面 2.从数据库中查询当前用户信息...将用户信息展示到页面中 2.实现用户修改功能 1.指定表单的提交地址以及请求方式 2.接受客户端传递过来的修改信息 找到用户 将用户信息更改为最新的 当用户访问
服务器端返回 response,并且将 sessionId 以 set-cookie 的方式种在客户端,这样,sessionId 就存在了客户端。...不过 Session 每次都需要服务器查找,JWT 信息都保存好了,不需要再去查询数据库) 时效性,Session 能直接从服务端销毁,JWT 只能等到时效性到了才会销毁(修改密码也无法阻止篡夺者的使用...简单的说,Mongoose就是对node环境中MongoDB数据库操作的封装,一个对象模型(ODM)工具,将数据库中的数据转换为JavaScript对象以供我们在应用中使用。...安装 mongoose npm install mongoose -S 连接及配置 const mongoose = require("mongoose"); mongoose.connect(..., ref: "Topic" }], select: false }, business: { type: Schema.Types.ObjectId, ref: "Topic
limit: 指定从MongoDB中读取的记录条数,可以当做页面大小pageSize。...事实上,更简单的办法是查看org.mongodb:bson:3.4.3里的ObjectId对象。...现实业务需求确实提出了跳页的需求,虽然几乎不会有人用,人们更关心的是开头和结尾,而结尾可以通过逆排序的方案转成开头。所以,真正分页的需求应当是不存在的。...例如,在文件表中,我们拥有一个"type"列索引,如果在"type"列中,android占了50%,如果现在要查询一个类型为android,文件名为“test.apk"的文件,我们则需要在表的50%的数据中查询...在看查询结果的阶段树的时候一定一定是从最里层一层一层往外看的,不是直接顺着读下来的。
你可以将 GraphQL 理解成一个中间件,是连接客户端和数据库之间的一座桥梁,客户端给它一个描述,然后从数据库中组合出符合这段描述的数据返回。...如果单单将所有资源整合到一个 API 之中,还有可能会因为整合了无关的数据而导致数据量的增加。...也就是说,如果是一个 Object,还必须选择至少其中的一个字段。 ? 把我们所需要的字段合在一起,我们把它称之为某某的选择集。...dob: String, photo: String, addr: String, movies: [ { type: think.Mongoose.Schema.Types.ObjectId...score: Number, release: String, cover: String, actors: [ { type: think.Mongoose.Schema.Types.ObjectId
写操作,默认情况下,客户端从主节点读取, 但是,客户端可以设置从复制节点读取。 ?...1567683192236.jpg 发现我们并不能直接查看 原因是: mongodb默认是从主节点读写数据的。 我们对复制节点进行进行设置。...db.getMongo().setSlaveOk(); db.test.find(); // { "_id" : ObjectId("5d70f1f19384bf8d850e2042"), "test..." : "123" } 数据已经从主节点同步过来了。...模拟宕机 mongo 故障 我们将主节点停止。(也可以直接kill,但是推荐安全退出) .
温故而知新,会增加一些功能,让这个项目更完善,适合初入全栈的前端工程师参考练手。小白看起来会比较吃力,这文档里就是点了几处需要注意的东西,具体实现看源码。 ---- ? ? ?...Also converts node object streams to binary....MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 ?...mongoose.model() 方法将模式“编译”为模型。模型就可以用来查找、创建、更新和删除特定类型的对象。 注:MongoDB 数据库中,每个模型都映射至一组文档。...type: Number, min: 18, max: 65, required: true }, mixed: Schema.Types.Mixed, _someId: Schema.Types.ObjectId
温故而知新,会增加一些功能,让这个项目更完善,适合初入全栈的前端工程师参考练手。小白看起来会比较吃力,这文档里就是点了几处需要注意的东西,具体实现看源码。...Also converts node object streams to binary. var json = require('koa-json'); var Koa = require('koa'...MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。...mongoose.model() 方法将模式“编译”为模型。模型就可以用来查找、创建、更新和删除特定类型的对象。 注:MongoDB 数据库中,每个模型都映射至一组文档。...Number, min: 18, max: 65, required: true }, mixed: Schema.Types.Mixed, \_someId: Schema.Types.ObjectId
" :"A", "destination" :"B", "value" :100, "state" :"initial"} 切换事务到Pending状态 在修改accounts集合记录之前,将事务状态从...将返回它的值,将会看到如下的输出: { "_id" :ObjectId("4d7bc7a8b8a04f5126961522"), "source" :"A", "destination" :"..._id},{$set:{state:"pending"}}) db.transactions.find() find()操作将返回transaction集合的内容,类似下面: { "_id" :ObjectId...然后把事务记录修改为pending状态 然后修改目标的collection记录,且将经过修改的记录打上pendingTransactions标记(注意这里用了CAS的方法进行记录的更改) 再将事务记录修改为...applied状态 再将目标collection记录中的pendingTransactions标记删除 最后将事务记录修改为done状态 上述基本所有修改操作都是使用了CAS的方法进行记录的更改,这样保证只在前置条件满足的情况下才更新记录
透视转换的步骤: 分组:这里需要为每个对象从多个基础行来创建单独的一列数据,这意味着要对行进行分组,这里依据的是objectid列。...扩展:从结果列考虑每个唯一的属性都需要一个结果列,对应的是attribute列。这里是attr1,attr2……attr5,列中包含5个表达式。...此处对就列是VALUE列。每组中若包含多个非NULL值 ,视情况也可用SUM/AVG。 ...若做到逆转换,将每个objectid 和每个attribute生成结果集中的一行 第一步是为每个甚而行生成5个属性副本,可以通过基础表和每个属性占一行虚拟辅助表执行交叉联接来实现,然后用select 返回...) AS attributes ) AS T WHERE VALUE IS NOT NULL 这里可以使用UNPIVOT表运算符,查询将更简单
领取专属 10元无门槛券
手把手带您无忧上云