【问题标题】:Autoincrement with Mongoose使用 Mongoose 自动增量
【发布时间】:2018-12-06 05:55:09
【问题描述】:

我正在尝试实现一个自动增量 user_key 字段。在这个网站上,我遇到了两个与我的问题相关的问题,但我不清楚我应该做什么。 This is the main one

我有两个 Mongoose 模型,这是我的 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 答案中提供的步骤,我创建了 products_counter 集合并插入了一个文档。

问题是当我尝试插入新产品时出现此错误: "TypeError: 无法读取属性 'sequence_value' of null"

这是上述控制台日志的输出。

第一个控制台日志输出:

function model (doc, fields, skipId) {
if (!(this instanceof model))
  return new model(doc, fields, skipId);
Model.call(this, doc, fields, skipId);
}

第二个控制台日志:

Null

你能看出我做错了什么吗?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您可以在中间件中运行以下行:

    console.log(products_counter.collection.collectionName);
    

    该行将打印 products_counters,而您预计您的代码会命中 products_counter。根据docs

    默认情况下,Mongoose 通过将模型名称传递给 utils.toCollectionName 方法来生成集合名称。此方法将名称复数。如果您的收藏需要不同的名称,请设置此选项。

    因此,您应该将集合 products_counter 重命名为 products_counters 或在架构定义中明确配置集合名称:

    var Counter = new Schema({
        _id: {type: String, required: true},
        sequence_value: {type: Number, default: 0}
    }, { collection: "products_counter" });
    

    【讨论】:

    • 是的!添加“,{集合:”products_counter“});”成功了,非常感谢
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多