自动增加猫鼬模型中的数字字段
Posted
技术标签:
【中文标题】自动增加猫鼬模型中的数字字段【英文标题】:Auto increment a number field in mongoose model 【发布时间】:2018-06-23 07:24:23 【问题描述】:我在我的网站上使用 mysql DB,现在将其更新到 MongoDB。某些表中的列会自动递增,我想确保同样的情况继续下去。 以下是我到目前为止的发现,但没有一个有效。 使用 mongoose-auto-increment 插件
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
autoIncrement = require('mongoose-auto-increment');
var connection = mongoose.createConnection("mongodb://localhost/myDatabase");
autoIncrement.initialize(connection);
EmborderSchema.plugin(autoIncrement.plugin,
model: 'Emborder',
field: 'emborder_id',
startAt: 28855,
increamentBy: 1
);
使用预保存钩子:
EmborderSchema.pre('save', function (next)
if (this.emborder_id == undefined)
Emborder.findOne()
.sort(emborder_id: -1)
.exec(function (err, data)
this.emborder_id = data.emborder_id + 1;
next();
)
else
next();
);
使用第一种方法会报错
E11000 重复键错误采集:24hd.24hd_emborder 索引:emborder_id_1 dup key:23345
第二种方法报此错误
E11000 重复键错误采集:24hd.24hd_emborder 索引:emborder_id_1 dup key: : null
注意:emborder_id 是我的旧 Mysql 数据库中的主键,并且在此代码中 emborder_id 的值未定义,因为我正在添加新记录。
请帮我找出这个方法出了什么问题。
【问题讨论】:
你能在exec
块内添加data
在第二种方法中打印的内容吗?
所以问题出在 this 上。如果我像@Himanshusharma 那样将 this 分配给变量,则第二种解决方案有效。当它进入 exec 函数时, this 引用发生了变化,我得到了 null 错误。
是的,问题就在于此。如果您得到解决方案,请标记答案。
原因是 Emborder.findOne()
有自己的作用域,并且在内部引用 this
会导致 Emborder
作用域。因此,如果我们将 this
放入变量 self
中。它工作正常。
【参考方案1】:
我会为你推荐第二种方法。
EmborderSchema.pre('save', function (next)
var self = this;
if (self.emborder_id == undefined)
Emborder.findOne()
.sort(emborder_id: -1)
.exec(function (err, data)
if(!data.emborder_id)
self.emborder_id = 1;
next();
else
self.emborder_id = data.emborder_id + 1;
next();
)
next();
);
有关更多信息,您可以阅读 javascript 中的 Context
。
例如,在函数内部,当您说:“this.accoutNumber”时,您指的是属性“accoutNumber”,该属性属于正在执行该函数的对象。
如果对象“foo”有一个名为“bar”的方法,当在“bar”内部使用JavaScript关键字“this”时,它指的是“foo”。如果函数“bar”在全局范围内执行,那么“this”指的是窗口对象。
上下文示例取自 --> https://blog.kevinchisholm.com/javascript/difference-between-scope-and-context/
【讨论】:
以上是关于自动增加猫鼬模型中的数字字段的主要内容,如果未能解决你的问题,请参考以下文章