【发布时间】: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中。它工作正常。
标签: node.js mongodb mongoose auto-increment