2

このスレッドの問題を 2 つの言葉で知りたい場合: 私はマングース関数 findOrAdd() を実行しようとしています: 探している Id が存在しない場合は、新しいドキュメントを追加する必要があります。その後 (そのため、いくつかの同期関数が必要です)、新しい ObjectIds に基づいて別のクエリを実行する必要があります。

これは私の投稿スキーマです

var com_post_schema = new Schema({
content: { type: String, required: true },
postedBy: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'com_user'
    }]
});

と私のユーザースキーマ

var com_user_schema = new Schema({
    name: { type: String, required: true },
    age: {type:Number}
});

したがって、投稿には複数の作成者が含まれる場合があります。私の問題: 作成者は、既存のユーザー (bootstrap-tokenfield で選択) または新しいユーザーにすることができます。次の json の例を参照してください。

{
   "content":"post content",
   "postedBy":[
      {
         "_id":"56a60a972b70225014753d1a",
         "name":"Paul",
         "age":20,
         "__v":0,
         "value":"Paul",
         "label":"Paul"
      },
      {
         "value":"John",
         "label":"John"
      }
   ]
}

ユーザー Paul は既に 'com_user' コレクションに存在します。ユーザー John を 'com_user' に保存してから、両方のユーザー ObjectIds refs (フィールド 'value' と 'label' は bootstrap-tokenfield によって送信されます) を使用して投稿を保存する必要があります。 . どうすればそれができるかわかりません。

編集 これは私の現在のコードです。まだ同期の問題があります。いくつかのテストを行ったところ、コンソールに「新しい投稿が追加されました」と「ユーザーが見つかりません..」がランダムに表示されます。

3 人のユーザーで試してみてください。

app.post('/api/community/posts', function(req,res){
var arr=[],i=0;
req.body.postedBy.forEach(function(el){

    com_user.findById(el._id, function (err, user) {
        if(user) {
            console.log("User found!");
            console.log(user);
            arr.push(mongoose.Types.ObjectId(user._id ));
            i++;

            if(i==req.body.postedBy.length-1) {
                console.log('UFi'+i)
                console.log(arr)
                var com_post1= new com_post({
                    content:req.body.content,
                    postedBy:arr,

                });
                com_post1.save(function(err){
                    if(!err){
                        console.log("New post added!");
                        res.json({"New post added! ":req.body.content});
                    }
                    else {
                        res.json({"Error adding post":'error'});
                        error(err)
                    }
                });
            }

        }
        else {
            var com_user1= new com_user({
                name:el.label,
                age: 20
            });
            com_user1.save(function(err,newuser){
                if(err)
                    console.log(err)
                else {
                    console.log('User not found and just added!');
                    console.log(newuser)
                    arr.push(mongoose.Types.ObjectId(newuser._id));
                    console.log(arr)
                    i++;
                    if(i==req.body.postedBy.length-1) {
                        console.log('NUFi'+i)

                        console.log(arr)
                        var com_post1= new com_post({
                            content:req.body.content,
                            postedBy:arr,

                        });
                        com_post1.save(function(err){
                            if(!err){
                                console.log("New post added!");
                                res.json({"New post added! ":req.body.content});
                            }
                            else {
                                res.json({"Error adding post":'error'});
                                error(err)
                            }
                        });
                    }
                }
            });
        }
    });

});
});
4

1 に答える 1

2

forEach が完了する前に forEach の後のコードが実行されるためです。このようにしてみてください

app.post('/api/community/posts', function(req,res){
var arr=[],i=0;
req.body.postedBy.forEach(function(el){

    com_user.findById(el._id, function (err, user) {
        if(user) {
            console.log("User found!");
            console.log(user);
            arr.push(mongoose.Types.ObjectId(user._id ));
            i++;
            if(i==req.body.postedBy.length-1) { //to ensure forEach is complete
                console.log(arr)
                var com_post1= new com_post({
                    content:req.body.content,
                    postedBy:arr,

                });
                com_post1.save(function(err){
                    if(!err)
                        res.json({"New post added! ":req.body.content});
                    else {
                        res.json({"Error adding post":'error'});
                        error(err)
                    }
                });
            }
        }
        else {
            var com_user1= new com_user({
                name:el.label,
                age: 20
            });
            com_user1.save(function(err,newuser){
                if(err)
                    console.log(err)
                else {
                    console.log('User not found and just added!');
                    console.log(newuser)
                    arr.push(mongoose.Types.ObjectId(newuser._id));
                    i++;
                    if(i==req.body.postedBy.length-1) {
                        console.log(arr)
                        var com_post1= new com_post({
                            content:req.body.content,
                            postedBy:arr,

                        });
                        com_post1.save(function(err){
                            if(!err)
                                res.json({"New post added! ":req.body.content});
                            else {
                                res.json({"Error adding post":'error'});
                                error(err)
                            }
                        });
                    }
                }
            });
        }
    });

});

于 2016-02-01T18:36:06.267 に答える