我正在尝试实现autoicremental user_key字段。在该站点上查看时,我遇到了两个与问题有关的问题,但是我不清楚应该怎么做。 This is the main one
我有两个猫鼬模型,这是我的ProductsCounterModel.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var Counter = new Schema({
_id: {type: String, required: true},
sequence_value: {type: Number, default: 0}
});
module.exports = mongoose.model('products_counter', Counter);
这是Mongoose模型,我尝试在其中实现自动递增字段:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var products_counter = require('./ProductsCounterModel.js');
var HistoricalProduct = new Schema({
product_key: { type: Number },
class: { type: String },
brand: { type: String },
model: { type: String },
description: { type: String }
});
HistoricalProduct.pre("save", function (next) {
console.log("first console log:",products_counter);
var doc = this;
products_counter.findOneAndUpdate(
{ "_id": "product_key" },
{ "$inc": { "sequence_value": 1 } },
function(error, products_counter) {
if(error) return next(error);
console.log("second console log",products_counter);
doc.product_key = products_counter.sequence_value;
next();
});
});
module.exports = mongoose.model('HistoricalProduct', HistoricalProduct);
按照上面的SO回答中提供的步骤,我创建了collections_counter集合并插入了一个文档。
问题是,当我尝试插入新产品时出现此错误: “ TypeError:无法读取null的属性'sequence_value'”
这是上述控制台日志的输出。
第一个控制台日志输出:
function model (doc, fields, skipId) {
if (!(this instanceof model))
return new model(doc, fields, skipId);
Model.call(this, doc, fields, skipId);
}
第二个控制台日志:
Null
您能看到我在做什么吗?
答案 0 :(得分:1)
您可以在中间件中运行以下行:
console.log(products_counter.collection.collectionName);
该行将打印 products_counters ,而您希望您的代码将命中 products_counter 。根据{{3}}:
默认情况下,猫鼬通过将模型名称传递给utils.toCollectionName方法来生成集合名称。此方法将名称复数。如果您的集合需要其他名称,请设置此选项。
因此,您应该将集合products_counter
重命名为products_counters
或在架构定义中显式配置集合名称:
var Counter = new Schema({
_id: {type: String, required: true},
sequence_value: {type: Number, default: 0}
}, { collection: "products_counter" });