对于Mongoose与方法在Mongoose感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解mongoose操作,并且为您提供关于egg(25)--mongoose索引,扩展Mongoose
对于Mongoose与方法在Mongoose感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解mongoose操作,并且为您提供关于egg(25)--mongoose索引 ,扩展Mongoose Model的静态方法和实例方法、Egg中使用egg-mongoose和常用的Mongoose 方法、egg学习笔记第二十三天:mongoose入门以及mongoose实现数据的增删改查、Express cookieSession和Mongoose:如何使request.session.user成为Mongoose模型?的宝贵知识。
本文目录一览:- Mongoose与方法在Mongoose(mongoose操作)
- egg(25)--mongoose索引 ,扩展Mongoose Model的静态方法和实例方法
- Egg中使用egg-mongoose和常用的Mongoose 方法
- egg学习笔记第二十三天:mongoose入门以及mongoose实现数据的增删改查
- Express cookieSession和Mongoose:如何使request.session.user成为Mongoose模型?
Mongoose与方法在Mongoose(mongoose操作)
据我所知,static
方法是Class Methods
,那methods
是InstanceMethods
,并且Virtuals
也喜欢Instance Methods
,但它们不是存储在数据库中。
但是,我想知道那是methods
和之间的唯一区别virtuals
。还有其他我想念的东西吗?
答案1
小编典典实例方法,静态方法或虚拟方法均未存储在数据库中。方法与虚拟函数之间的区别在于,虚拟函数的访问方式类似于属性,方法的调用方式类似于函数。实例与静态实例与虚拟实例之间没有区别,因为在类上具有可访问的虚拟静态属性是没有意义的,但在类上具有某些静态实用程序或工厂方法确实是有道理的。
var PersonSchema = new Schema({ name: { first: String, last: String }});PersonSchema.virtual(''name.full'').get(function () { return this.name.first + '' '' + this.name.last;});var Person = mongoose.model(''Person'', PersonSchema);var person = new Person({ name: { first: ''Alex'', last: ''Ford'' }});console.log(person.name.full);// would print "Alex Ford" to the console
而方法的调用方式就像普通函数一样。
PersonSchema.method(''fullName'', function () { return this.name.first + '' '' + this.name.last;});var person = new Person({ name: { first: ''Alex'', last: ''Ford'' }});console.log(person.fullName());// notice this time you call fullName like a function
您也可以像常规属性一样“设置”虚拟属性。只需调用.get
和.set
设置两个操作的功能。注意,在中.get
您返回一个值,而在中.set
您接受一个值并使用它来设置文档的非虚拟属性。
PersonSchema .virtual(''name.full'') .get(function () { return this.name.first + '' '' + this.name.last; }) .set(function (fullName) { var parts = fullName.split('' ''); this.name.first = parts[0]; this.name.last = parts[1]; });var person = new Person({ name: { first: ''Alex'', last: ''Ford'' }});console.log(person.name.first);// would log out "Alex"person.name.full = ''Billy Bob'';// would set person.name.first and person.name.last appropriatelyconsole.log(person.name.first);// would log out "Billy"
从技术上讲,您可以对所有方法使用方法,而从不使用虚拟属性,但是对于某些事情(例如我在此处展示的示例)来说,虚拟属性很优雅person.name.full
。
egg(25)--mongoose索引 ,扩展Mongoose Model的静态方法和实例方法
索引
索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更
快。MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询
优化技巧
user.js
var mongoose = require(''./db.js'');
var UserSchema = mongoose.Schema({
name:String,
sn:{
type:String,
},
age:Number,
status:{
type:Number,
default:1
}
})
//定义model操作数据库
// var UserModel = mongoose.model(''User'',UserSchema); //将生成users表
var UserModel = mongoose.model(''User'',UserSchema,''user'');
module.exports = UserModel
查找user表的索引
db.user.getIndexes()
增加字段sn的索引
sn:{
type:String,
index:true
},
user.js
var mongoose = require(''./db.js'');
var UserSchema = mongoose.Schema({
name:String,
sn:{
type:String,
index:true
},
age:Number,
status:{
type:Number,
default:1
}
})
//定义model操作数据库
// var UserModel = mongoose.model(''User'',UserSchema); //将生成users表
var UserModel = mongoose.model(''User'',UserSchema,''user'');
module.exports = UserModel
查找索引
扩展Mongoose Model的静态方法
user.js
增加UserSchema.statics.findBySn
var mongoose = require(''./db.js'');
var UserSchema = mongoose.Schema({
name:String,
sn:{
type:String,
index:true
},
age:Number,
status:{
type:Number,
default:1
}
})
UserSchema.statics.findBySn=function(sn,cb){
this.find({"sn":sn},function(err,docs){
cb(err,docs)
})
}
//定义model操作数据库
// var UserModel = mongoose.model(''User'',UserSchema); //将生成users表
var UserModel = mongoose.model(''User'',UserSchema,''user'');
module.exports = UserModel
index.js
先增加sn=123456
的数据
var user = new UserModel({
name:''标题3'',
age:20,
sn:"123456"
})
user.save(function(err,doc){
if(err){
console.log(err);
return;
}
console.log(doc)
})
使用UserSchema.statics.findBySn
方法
var UserModel = require(''./user.js'');
//静态方法
UserModel.findBySn(''123456'', function (err, doc) {
if (err) {
console.log(err);
return;
}
console.log(doc)
})
运行
Egg中使用egg-mongoose和常用的Mongoose 方法
Mongoose
Mongoose就是一套操作MongoDB数据库的接口,而Egg中有对应的插件egg-mongoose。
安装
$ npm install egg-mongoose --save
配置
改变Egg项目中的配置文件{workplace}/config/plugin.js中来启用 egg-mongoose 插件:
exports.mongoose = {
enable: true,
package: ''egg-mongoose'', };
Egg连接mongoose
在Egg项目中的配置文件{workplace}/config/default.js配置项config添加属性
config.mongoose = {
url: process.env.EGG_MONGODB_URL || ''mongodb://127.0.0.1/website'',
options: {
server: {
poolSize: 40,
},
},
};
定义数据表
在{workplace}/app/model/article.js定义数据表
''use strict'';
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const PostSchema = new Schema({
wid: {
type: String,
},
release: {
type: Boolean, }, sort: { type: Number, }, img: { type: String, }, abstract: { type: String, }, text: { type: String, }, isSetTop: { type: Number, }, title: { type: String, }, keywords: { type: String, }, describe: { type: String, }, updateTime: { type: Date, }, num: { type: Number, }, uid: { type: String, }, editors: { type: String, }, disable: { type: Boolean, }, columnId: { type: Schema.Types.ObjectId, }, }); return mongoose.model(''Article'', PostSchema); };
备注:其中type表示字段类型,Mongoose 有以下几种类型Number(数字),String(字符串),Boolean(布尔值),ObjectId(对象ID),Array(数组),Object(对象),Date(日期)。。。
常用的Mongoose 方法
一,增加数据
this.ctx.model.Article.create(post,callback);
备注:其中post为json数据结构,callback为操作后的回调函数
二,查询数据
1,获取所有数据,返回是一个数组
this.ctx.model.Article.find()
2,获取一个数据,返回是一个对象
this.ctx.model.Article.findOne()
3,条件查询
this.ctx.model.Article.find(conditions,callback);
condition有以下几种类型
1),根据具体数据进行查询
this.ctx.model.Article.find({_id:5c4a819fb87ba4002a47bc4f,title:"123"},callback);
- 返回_id为5c4a819fb87ba4002a47bc4f,title为123的结果
2),条件查询
"$lt" 小于 "$lte" 小于等于 "$gt" 大于 "$gte" 大于等于 "$ne" 不等于
this.ctx.model.Article.find({“sort”:{ $get:18 , $lte:30 });
- 返回Article表中sort 大于等于18并小于等于30的结果
3),或查询 OR
"$in" 一个键对应多个值 "$nin" 同上取反, 一个键不对应指定值 "$or" 多个条件匹配, 可以嵌套 $in 使用 "$not" 同上取反, 查询与特定模式不匹配的文档
this.ctx.model.Article.find({"title":{ $in:[20,21,22."haha"]} );
- 返回Article表中title等于20或21或21或"haha"的结果
this.ctx.model.Article.find({"$or" : [ {"age":18} , {"name":"wxw"} ] });
- 返回Article表中age等于18或 name等于"wxw"的结果
4),类型查询("$exists"
条件判定)
this.ctx.model.Article.find({name: {$exists: true}},function(error,docs){ //返回Article表中所有存在name属性的结果 });
this.ctx.model.Article.find({telephone: {$exists: false}},function(error,docs){ //返回Article表中所有不存在telephone属性的结果 });
5),匹配正则表达式查询
MongoDb 是使用 Prel兼容的正则表达式库来匹配正则表达式
this.ctx.model.Article.find( {"name" : /joe/i } );
- 返回Article表中name为 joe 的结果, 并忽略大小写
6),查询数组
this.ctx.model.Article.find({"array":10} );
- 返回Article表中array(数组类型)键中有10的文档, array : [1,2,3,4,5,10] 会匹配到
this.ctx.model.Article.find({"array[5]":10} );
- 返回Article表中array(数组类型)键中下标5对应的值是10, array : [1,2,3,4,5,10] 会匹配到
this.ctx.model.Article.find({"array":[5,10]});
- 返回Article表中查询匹配array数组中既有5又有10的结果
this.ctx.model.Article.find({"array":{$size : 3} });
- 返回Article表中查询匹配array数组长度为3 的的结果
this.ctx.model.Article.find({"array":{$slice : 10} });
- 返回Article表中查询匹配array数组的前10个元素
this.ctx.model.Article.find({"array":{$slice : [5,10]} });
- 返回Article表中查询匹配array数组的第5个到第10个元素
7),where
用它可以执行任意javacript语句作为查询的一部分,如果回调函数返回 true 文档就作为结果的一部分返回
this.ctx.model.Article.find( {"$where" : "this.x + this.y === 10" } ); this.ctx.model.Article.find( {"$where" : " function(){ return this.x + this.y ===10; } " } )
- 其中this为数据表中的数据,上述返回Article表中属性x+属性y=10的所有数据
三,删除数据
this.ctx.model.Article.remove(conditions,callback);
备注:conditions为查询条件,与查询数据介绍的一样,eg:{ _id:5c4a819fb87ba4002a47bc4f },找到_id为5c4a819fb87ba4002a47bc4f的数据,callback为操作成功后的回调函数
四,更新数据
this.ctx.model.Article.update(conditions, update, callback)
- 参数1:查询条件, 参数2:更新对象,可以使用MondoDB的更新修改器
备注:conditions与查询数据中介绍的一样
1,update为更新对象
let post = {
wid: ''5c492c57acbe363fd4824446'',
column: [ ''新闻'' ], titleHead: '''', img: '''', isAbstract: ''false'', } this.ctx.model.Article.update({ _id: ''5c4a819fb87ba4002a47bc4f '' }, post)
- 查询Article表中特定_id,并对post中所包含的属性进行更新。
2,update使用MondoDB的更新修改器,有以下几种使用场景
1),"$inc"
增减修改器,只对数字有效
this.ctx.model.Article.update({"age":22}, {$inc:{"age":1} } );
- 找到age=22的文档,修改文档的age值自增1
2),''$set''
指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型.
this.ctx.model.Article.update({ _id:5c4a819fb87ba4002a47bc4f }, { $set: { isDelete: true } });
- 对5c4a819fb87ba4002a47bc4f 表进行软删除,找到特定_id数据,增加或者修改isDelete属性
3),"$unset"
同上取反,删除一个键
this.ctx.model.Article.update({age:22}, {$unset:{age:18} } );
- 执行后age键不存在
4),''$push''
给一个键push一个数组成员,键不存在会创建,对数组有效
this.ctx.model.Article.update({name:''wxw''}, {$push:{array:10} } );
- 返回Article表中name为wxw的数据,增加一个array键,类型为数组,有一个成员 10
5),''$addToSet''
向数组中添加一个元素,如果存在就不添加
this.ctx.model.Article.update({name:''wxw''},{$addToSet:{array:10} } );
- 返回Article表中name为wxw的数据,array中有10所以不会添加
6),''$each''
遍历数组和 $push 修改器配合可以插入多个值
this.ctx.model.Article.update({name:''wxw''}, {$push:{array:{$each: [1,2,3,4,5]}} } );
- 返回Article表中name为wxw的数据,执行后array : [10,1,2,3,4,5]
7),''$pop''
向数组中尾部删除一个元素
this.ctx.model.Article.update({name:''wxw''}, {$pop:{array:1} } );
- 返回Article表中name为wxw的数据,其中array : [10,1,2,3,4,5],执行后 array : [10,1,2,3,4]
- tip:将1改成-1可以删除数组首部元素
8),''$pull''
向数组中删除指定元素
this.ctx.model.Article.update({name:''wxw''}, {$pull:{array:10} });
- 返回Article表中name为wxw的数据,匹配到array中的10后将其删除。
五,排序(sort)
this.ctx.model.Article.sort({ isSetTop: -1, sort: 1, editTime: -1 });
- 对Article表中的数据进行排序,先按“isSetTop”降序,再按“sort”升序,最后按“editTime”降序
备注:键对应数据中的键名,值代表排序方向,1 升序, -1降序。
六,限制返回结果的数量(limit)
this.ctx.model.Article.limit(3);
- 对Article表中的数据进行返回,返回为前面3条数据
七,跳过前3个文档,返回其余的(skip)
this.ctx.model.Article.skip(3);
- 对Article表中的数据进行返回,跳过前面3条数据,返回其余数据
附:综合使用最后三个方法进行分页查询
this.ctx.model.Article.find({ _id:5c4a819fb87ba4002a47bc4f }).skip(pageSize * (pageNum - 1)).limit(parseInt(pageSize)).sort({ isSetTop: -1, sort: 1, editTime: -1 });
- 其中pageSize和pageNum为动态传递数据,返回Article表中特定_id在每页数据为pageSize条件下的第pageNum页中的数据,并按照“isSetTop”降序,再按“sort”升序,最后按“editTime”降序进行排序。
egg学习笔记第二十三天:mongoose入门以及mongoose实现数据的增删改查
一、mongoose介绍
Mongoose实在nodejs异步环境下对MongoDB进行便捷操作的对象模型工具。Mongoose是nodejs的驱动,不能作为其他语言的驱动。
mongoose有两个特点:
1、通过关系型数据库的思想来设计非关系型数据库。
2、基于MongoDB驱动,简化操作。
二、使用Mongoose
1、新建mongoose文件夹,文件夹下新建mongoose_demo.js文件
2、执行npm init -y,生成package.json文件
cnpm init -y
3、安装mongoose
cnpm i mongoose --save
目录结构如下所示:
④mongoose_demo.js里面键入:
const mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1:27017/eggcms");
// 如果有账户密码需要采用下面的连接方式:
// mongoose.connect(''mongodb://eggadmin:123456@localhost:27017/eggcms'');
⑤定义 Schema:
数据库中的 Schema,为数据库对象的集合。schema 是 mongoose 里会用到的一种数据模式, 可以理解为表结构的定义;每个 schema 会映射到 mongodb 中的一个 collection,它不具备操作数据库的能力。
定义一个动漫表的Schema:
⑥定义模型
定义好了Schema,接下就是生成Model。model是由schema生成的模型,可以对数据库的操作。
注意:mongoose.model 里面可以传入两个参数也可以传入三个参数
①mongoose.model(参数 1:模型名称(首字母大写),参数 2:Schema)
②mongoose.model(参数 1:模型名称(首字母大写),参数 2:Schema, 参数 3:数据库集合名称)
如果传入 2 个参数的话:这个模型会和模型名称相同的复数的数据库建立连接: 一般用第二种传入 3 个参数的话:模型默认操作第三个参数定义的集合名称
// 1、引入mongoose
const mongoose = require("mongoose");
// 2、连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/eggcms");
// 如果有账户密码需要采用下面的连接方式:
// mongoose.connect(''mongodb://eggadmin:123456@localhost:27017/eggcms'');
// 3、操作动漫表(集合) 定义一个Schema 对字段的格式可以进行一些验证 Schema里的对象和数据库表里面的字段需要一一对应
var DongManSchema = mongoose.Schema({
name: String,
age: Number,
status: Number
});
// 定义model
var DongMan = mongoose.model("DongMan", DongManSchema, dongman);
⑦给dongman表中增加一条数据:键入如下代码,执行 node mongoose_demo.js
// 1、引入mongoose
const mongoose = require("mongoose");
// 2、连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/eggcms");
// 如果有账户密码需要采用下面的连接方式:
// mongoose.connect(''mongodb://eggadmin:123456@localhost:27017/eggcms'');
// 3、操作动漫表(集合) 定义一个Schema 对字段的格式可以进行一些验证 Schema里的对象和数据库表里面的字段需要一一对应
var DongmanSchema = mongoose.Schema({
name: String,
age: Number,
status: Number
});
// 定义model,操作数据库
var DongMan = mongoose.model("Dongman", DongmanSchema, "dongman");
// 增加数据
// 实例化Model, DongMan Model 创建增加的数据
// 实例.save()
var dongman = new DongMan({
name: "犬夜叉",
age: 18,
status: 0
});
dongman.save(function(err) {
if (err) {
console.log(err);
return;
}
console.log("成功");
});
可以看到数据库可视化工具中多了一条数据。
⑧查询表中的数据:
// 定义model,操作数据库
var DongMan = mongoose.model("Dongman", DongmanSchema, "dongman");
// 查询dongman表中的数据;
DongMan.find({}, function(err, doc) {
if (err) {
console.log(err);
return;
}
console.log(doc);
});
⑨修改表中的数据,找到指定Id的数据,将name犬夜叉变为name火影忍者。
// 定义model,操作数据库
var DongMan = mongoose.model("Dongman", DongmanSchema, "dongman");
DongMan.updateOne(
{
_id: "5ea99dd5edd15105512ad7fa"
},
{
name: "火影忍者"
},
function(err, doc) {
if (err) {
return console.log(err);
}
console.log("成功");
}
);
查看GUI工具,可得数据已更新
⑩删除数据,删除指定id数据。
// 定义model,操作数据库
var DongMan = mongoose.model("Dongman", DongmanSchema, "dongman");
// 删除数据
DongMan.deleteOne({ _id: "5ea99dd5edd15105512ad7fa" }, (err, res) => {
if (err) {
return console.log(err);
}
console.log(res);
});
GUI刷新后,发现数据被清空
感觉都是些傻瓜式操作,但是还是要熟悉的。GG晚安思密达。
Express cookieSession和Mongoose:如何使request.session.user成为Mongoose模型?
创建新用户帐户后,我创建了newUser,这是一个Mongoose模型实例,如下所示:
_events: Object
errors: undefined
isNew: false
save: function () {
arguments: null
caller: null
_doc: Object
name: 'Joe Smith'
...
该对象的实际数据位于 _doc 属性中,尽管存在getter和setter,所以您可以运行:
user.name = 'Jane Doe'
这样就可以了。我跑:
request.session.user = newUser;
将用户保存到会话。到目前为止,一切都很好。
但是,在后续请求中,request.session.user似乎只是_doc中的内容。例如:
name: 'Joe Smith'
很好,但这意味着我无法运行例如 request.session.user.save() 来保存更改。
我可以简单地制作一些中间件来查找与数据关联的用户。但是我想了解更多有关Express和Mongoose在这里做什么的信息。
如何使request.session.user成为Mongoose模型?
更新 :我当前的中间件黑客:
// Use as a middleware on routes which need users
// TODO: only needed due to request.session.user being saved weirdly
var rehydrateUser = function(request,response,next) {
if ( request.session.user ) {
var hydrated = request.session.user.save
if ( ! hydrated ) {
console.log('Rehydrating user...');
models.User.findOne({ somefield: request.session.user.somefield },function (err,user) {
if ( err ) {
request.session.error = 'User not found in DB!';
request.redirect('/');
} else {
request.session.user = user;
console.log('Rehydrated user! All repos already being monitored.');
next();
}
})
} else {
next();
}
} else {
console.log('No user in session')
next();
}
}
我们今天的关于Mongoose与方法在Mongoose和mongoose操作的分享已经告一段落,感谢您的关注,如果您想了解更多关于egg(25)--mongoose索引 ,扩展Mongoose Model的静态方法和实例方法、Egg中使用egg-mongoose和常用的Mongoose 方法、egg学习笔记第二十三天:mongoose入门以及mongoose实现数据的增删改查、Express cookieSession和Mongoose:如何使request.session.user成为Mongoose模型?的相关信息,请在本站查询。
本文标签: