【问题标题】:Use counter collection in node.js to increment ID field在 node.js 中使用计数器集合来增加 ID 字段
【发布时间】:2016-01-28 06:18:17
【问题描述】:

我想在我的一个集合上设置一个自动递增的 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 应用于项目创建逻辑:

 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);
};

希望以上内容有意义。非常感谢任何帮助。

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    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);
                });
    
    
    };
    

    【讨论】:

    • 感谢保罗,成功了。我需要阅读异步方面的内容。
    【解决方案2】:

    我想我会用 Paul 的答案提出我最终得到的结果。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2015-10-10
      • 2021-09-18
      • 2013-08-24
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多