猫鼬自动递增

时间:2018-12-05 17:47:17

标签: node.js mongodb mongoose

我正在尝试实现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集合并插入了一个文档。

My document

问题是,当我尝试插入新产品时出现此错误: “ 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

您能看到我在做什么吗?

1 个答案:

答案 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" });