node.js - Mongoose 中的自动递增序列

标签 node.js mongodb mongoose

我正在尝试在 uisng mongoose 中实现自动增量。 但我被困住了。

计数器架构

计数器.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var counterSchema = new Schema({
    _id: {type: String, required: true},
    sequence_value: {type: Number, default: 1}
});

var Counter = module.exports = mongoose.model('Counter', counterSchema);

产品架构

产品.js

var productsSchema = new Schema({
    productId: {type: String, require: false},
    merchantId: {type: String, required: false}
)}

我创建了计数器集合并在其中插入了一条记录。

{
    "_id" : "productId",
    "sequence_value" : 1
}

在计数器集合中包含增加计数器的方法

//COUNTER COLLECTION
function getNextSequenceValue(sequenceName){

   var sequenceDocument = Counters.findOneAndUpdate({
      query:{_id: sequenceName },
      update: {$inc:{sequence_value:1}},
      new:true
   });

   return sequenceDocument.sequence_value;
}

调用方法来增加序列号:

product.productId = getNextSequenceValue("productid");

但是它不起作用,产品集合中没有保存任何内容?

最佳答案

下一个序列应该是

product.productId = getNextSequenceValue("productId"); // camelCase

在计数器集合中,您已添加带有键productId(驼峰式)的文档,但尝试使用键productid(全部小写)获取序列

mongo CLI

> function getNextSequenceValue(sequenceName){
... 
...    var sequenceDocument = db.counters.findOneAndUpdate(
...       { "_id" : sequenceName },
...       { $inc : { sequence_value : 1 } },
...       { new : true }
...    );
...    return sequenceDocument.sequence_value;
... }
> 

EDIT-2 与 Mongoose

var counterSchema = mongoose.Schema(
    {
        _id: { type: String, required: true },
        sequence_value: { type: Number, default: 1 }
    }
);

var Counters = mongoose.model('Counters', counterSchema);

var productsSchema = mongoose.Schema({
    productId: {type: String, require: true},
    merchantId: {type: String, required: false}
});

productsSchema.pre('save', function(next){
    var doc = this;
    Counters.findOneAndUpdate(
        { _id: 'productId' },
        { $inc : { sequence_value : 1 } },
        { new : true },  
        function(err, seq){
            if(err) return next(err);
            doc.productId = seq.sequence_value;
            next();
        }
    );
 }
);

var Product = mongoose.model('Product', productsSchema);
var testProduct = new Product({merchantId : 'test'})

testProduct.save(function (err, doc){
    console.log('saved ' + doc )
})

输出(带有生成的productId)

saravana@ubuntu:~/node-mongoose$ node app.js
`open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-client
Mongoose: counters.findAndModify({ _id: 'productId' }, [], { '$inc': { sequence_value: 1 } }, { new: true, upsert: false, remove: false, fields: {} })
Mongoose: products.insert({ productId: '36', merchantId: 'test', _id: ObjectId("5a5b27b860716d24007df611"), __v: 0 })
saved { __v: 0,
  productId: '36',
  merchantId: 'test',
  _id: 5a5b27b860716d24007df611 }
^C
saravana@ubuntu:~/node-mongoose$

关于node.js - Mongoose 中的自动递增序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48239888/

相关文章:

node.js - AWS EB - 将所有流量重定向到 https

json - Node.js 请求 GET 返回原始数据而不是 JSON

javascript - 将 Javascript 数组值放入 M​​ongodb 集合值中

mongodb - 将日期转换为时间戳 mongodb

node.js - 注销后nodejs实际上并没有销毁 session

javascript - Mongoose 模型如何在不导出的情况下工作

java - 如何查找其中元素与另一个数组中的其他元素匹配的数组的文档?

node.js - MongoDB 值增加一次后不再增加

javascript - mongoose中如何连接字符串并需要传入updateOne

javascript - 未初始化的变量不应该总是未定义类型吗