在节点中使用计数器集合.js递增 ID 字段

Use counter collection in node.js to increment ID field

本文关键字:js 递增 ID 字段 集合 计数器 节点      更新时间:2023-09-26

我想在我的一个集合上设置一个自动递增的 ID(_id太长了)。为此,我按照包括Mongos官方网站(下图)在内的许多帖子中的建议创建了一个"计数器"集合:

var mongoose = require('mongoose');
module.exports = mongoose.model('Counter', {
    _id: String,
    sequence_value: Number
});

然后我插入了一个带有 seq 值的计数器。下面是创建新项时调用的函数。添加新项的逻辑有效,获取计数器值的查询在console.log(data.sequence_value);返回sequence_value的范围内工作。

但是,我无法通过执行以下操作将sequence_value应用于项目创建逻辑:

 module.exports.newitem = function(req, res){            
            var nextId = Counter.findByIdAndUpdate(
                {_id: 'productid'},
                { $inc: { incr: 1 } },
                function (err, data) {
                    if(err){
                        console.log(err.stack || err.message)
                    } else{
                        console.log("successful")
                    }
                    console.log(data.sequence_value);
                    return data.sequence_value
                });
        var item = new Item();
        item.itemId = nextId;
        // Save the item that has been sent.
        item.save();
        // If adding the user is successful. Send back the user.
        res.json(req.body);
    };

逻辑的当前脱节版本如下:

module.exports.newitem = function(req, res){
        Counter.findByIdAndUpdate(
            {_id: 'productid'},
            { $inc: { incr: 1 } },
            function (err, data) {
                if(err){
                    console.log(err.stack || err.message)
                } else{
                    console.log("successful")
                }
                console.log(data.sequence_value);
            });

    var item = new Item();
    item.itemId = "2000";
    // Save the item that has been sent.
    item.save();
    // If adding the user is successful. Send back the user.
    res.json(req.body);
};

希望以上是有道理的。任何帮助都非常感谢。

findByIdAndUpdate是一个

异步函数。 您应该将依赖于其回调的逻辑放在回调本身中,如下所示:

        var nextId = Counter.findByIdAndUpdate(
            {_id: 'productid'},
            { $inc: { incr: 1 } },
            function (err, data) {
                if(err){
                    console.log(err.stack || err.message)
                } else{
                    console.log("successful")
                }
                console.log(data.sequence_value);
                var item = new Item();
                item.itemId = data.sequence_value;
                 // Save the item that has been sent.
                item.save();  // arguably, your response would come in the .save() callback, if you care about whether that was successful or not. 
               // If adding the user is successful. Send back the user.
                res.json(req.body);
            });

};

以为我会用保罗的答案来表达我最终得到的东西。

module.exports.newitem = function(req, res){
        Counter.findByIdAndUpdate(
            {_id: 'productid'},
            { $inc: { sequence_value: 1 } },
            { "upsert": true },
            function (err, data) {
                if(err){
                    console.log(err.stack || err.message)
                } else{
                    var item = new Item();
                    item.itemId = data.sequence_value;
                    ...
                    // Save the item that has been sent.
                    item.save();
                    // If adding the user is successful. Send back the user.
                    res.json(req.body);
                    console.log("successful")
                }
            });
};