検索

ホームページ  >  に質問  >  本文

node.js - nodejs+express+mongodb自定义_id自增怎么写?

通过这个教程学习了解到是用.findAndModify()方法可以实现,并且通过命令行操作也实现了,但是在node项目中怎么写呢?
2016.9.8更新------------------------------------------------------------------------------
为什么给movie的id赋值的时候调用newID函数获取不到值呢?执行的时候newID("movieId")总是等于undefind,貌似在数据库查询没有返回的时候下面的JS就执行了。如果不用函数,直接把else部分写在.findAndModify()的callback里就能正常获取到值。
如果一定要用下面这种写法,newID("movieId")怎么才能获取到值呢?

function newID(indexName){
    Counter.findAndModify(
    {_id: indexName },
    [],
    {$inc:{count:1}},
    {new:true},
    function (err,obj) {
        console.log(obj)
        可以获取到obj.value.count,怎么写才能返回到外部函数?
    }
    怎么写能返回给函数?
}
app.post('/admin/movie/new',function (req, res) {
    略...
if(id !== 'undefined'){
    略...
}else{
    _movie = new Movie({
        _id:newID("movieId"),
        title:movieObj.title,
        doctor: movieObj.doctor,
        country: movieObj.country,
        year:movieObj.year,
        poster:movieObj.poster,
        language:movieObj.language,
        flash:movieObj.flash,
        summary:movieObj.summary
    })
    _movie.save(function (err, movie) {
        if(err){
            console.log(err)
        }
        res.redirect('/movie/'+ movie._id)
    })
        );
    }
});
PHPzPHPz2873日前760

全員に返信(2)返信します

  • 大家讲道理

    大家讲道理2017-04-17 14:51:04

    最初にお聞きしたいのですが、自己インクリメントという場合は 1、2、3、4 でなければなりません...そうですか?デフォルトの ObjectID は実際には自動的にインクリメントされるためです。数値シーケンスの使用には制限があります。その理由はこの質問で説明しました。
    公式文書にもこの問題に関する指示が記載されています。
    問題はドライバー自体の使用方法にあるのではなく、イベント ドライバーに対する間違った理解にあります。

    function newID(indexName, callback) {
        Counter.findAndModify({
                _id: インデックス名
            }、[]、{
                $inc: {
                    カウント: 1
                }
            }、{
                新しい: 本当
            }、
            関数(err, obj) {
                // エラー処理は省略
                コンソールログ(obj)
                コールバック(obj.value.count);
            }
        }
    }
    app.post('/admin/movie/new', function(req, res) {
        // わずかに...
        if (id !== '未定義') {
            // わずかに...
        } それ以外 {
            newID("映画ID", function(id) {
    
                _movie = 新しい映画({
                    _id: ID、
                    タイトル: movieObj.title、
                    医師: movieObj.doctor、
                    国: movieObj.country、
                    年: movieObj.year、
                    ポスター: movieObj.poster、
                    言語: movieObj.言語、
                    フラッシュ: movieObj.flash、
                    概要: movieObj.summary
                });
                _movie.save(function(err, movie) {
                    if (エラー) {
                        コンソールログ(エラー)
                    }
                    res.redirect('/movie/' + movie._id);
                });
            });
        }
    });
    

    返事
    0
  • PHPz

    PHPz2017-04-17 14:51:04

    私のアプローチは、変数を追加することです。 。 。

    var i = 0;
    var IncSchema = 新しいスキーマ({
        _id:{type:Number,/*increment:true,*/default:function () {
            i++ を返します。
        }}、
        name:{type:String, lowercase: true, trim: true,match:/a/},//通常の検証、小文字に変換し、先頭と末尾のスペースを削除します
        sex:{type:String,enum: ['male', ' Female', 'unknown'],required:true},//必須であり、enum の値のみを入力できます
        年齢:{タイプ:数値、最小:0、最大:150、デフォルト:関数 () {
            return Math.floor(Math.random()*150);//最小最大デフォルトは、関数の戻り値、パラメータを受け取ることができるかどうか、およびパラメータの取得元です。
        }}
    });

    返事
    0
  • キャンセル返事