Node + Mongoose,保存前等待结果

时间:2016-09-28 15:53:02

标签: node.js asynchronous mongoose

我实际上是想在我的mongodb数据库中保存一条新记录。

   company.save(function(err, company){
        if (err)
            //fail;

    //success
    })

但是,在此行动之前,我想向我的公司添加标签

我的公司架构

var companySchema = new mongoose.Schema({
    name: String,
    accro: String,
    npa: String,
    city: String,
    country: String,
    isverified : Boolean,
    tags: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Tag'  //  réf. tagSchema
    }
    ]
})

如你所见,标签是一个参考,所以我正在检查标签是否已经存在:

for (var i = 0; i < req.body.tags.length; i++) {
        var currentTag = req.body.tags[i];

        Tag.findOne({'label': currentTag }, function(err,t){
            var tag_id = "";

            if(err) res.send(err);

            // if exist
            if (t) {
                console.log("#" + i + " currentTag existe");
                t.use++;
                t.save();
                tag_id = t._id;

            } else {

                console.log("#" + i + " currentTag not existe");
                var tag = new Tag();
                tag.label = currentTag;
                tag.save();
                tag_id = tag._id;
            }

            company.tags.push(tag_id);

        });
    }

但由于mongoose findOne函数有一个回调,循环只是“循环”,当company.save()被触发时,没有标签被添加到公司..

需要一些帮助才能让它异步:)谢谢

3 个答案:

答案 0 :(得分:1)

您正在寻找的模式是P

P

答案 1 :(得分:1)

您无需逐个查找标签。在下面使用$ in运算符:

Tag.find({'label': {$in: req.body.tags}},function(err,oldTags){


            if(err) res.send(err);
var tag_id = '';
            for(var i = 0; i < req.body.tags.length; i++){
              for(var j = 0; j < oldTags.length; j++){

              if(req.body.tags[i] == oldTags[j].label){
               oldTags[j].use++;
               oldTags[j].save(function(err, tag) {
                                company.tags.push(tag._id);


});
              } else {
              console.log("#" + i + " currentTag not existe");
              var tag = new Tag();
              tag.label = req.body.tags[i];
              tag.save(function(err, newTag) {
                                company.tags.push(newTag._id);


});
              }

            }
            }
// HERE SAVE YOUR COMPANY OBJECT
        });

<强>更新

Tag.find({
    'label': {
        $in: req.body.tags
    }
}, function(err, oldTags) {

    if (err) res.send(err);
    var tags_id = [];
    var db_labels = [];
    var db_ids = [];
    var new_tags = [];

    for (var i = 0; i < oldTags.length; i++) {
        db_labels.push(oldTags[i].label);
        db_ids.push(oldTags[i]._id);
    }

    for (var i = 0; i < req.body.tags.length; i++) {
        var label = req.body.tags[i].trim().toUpperCase();
        var tag_id = "";
        if (db_labels.indexOf(label) == -1) {

            //tag not found
            //var tag = new Tag();
            //tag.label = label;
            new_tags.push({
                    label: label
                })
                // tag.save(function(err, newTag) {
                //     tags_id.push(newTag._id);
                // });

        } else {

            //tag found
            tags_id.push(db_ids[db_labels.indexOf(label)]);

        }
    }

    Tag.collection.insert(new_tags, function(err, data) {
        tags_id = tags_id.concat(data.insertedIds);
        company.tags = tags_id;
        company.save(function(err, company) {
            if (err)
                res.send(err);

            res.json(company);
        })
    });
});

答案 2 :(得分:0)

关注@Sachin回答:得到了这个:

    Tag.find({'label': {$in: req.body.tags}},function(err,oldTags){

      if(err) res.send(err);
                var tags_id = [];
                var db_labels = [];
                var db_ids = [];

                for (var i = 0; i < oldTags.length; i++) {
                    db_labels.push( oldTags[i].label );
                    db_ids.push( oldTags[i]._id );
                }

                for (var i = 0; i < req.body.tags.length; i++) {
                    var label = req.body.tags[i].trim().toUpperCase();
                    var tag_id = "";
                    if ( db_labels.indexOf(label) == -1) {

                        //tag not found
                        var tag = new Tag();
                        tag.label = label;
                        tag_id = tag._id;
                        tag.save();

                    } else {

                        //tag found
                        tag_id = db_ids[db_labels.indexOf(label)];

                    }
                    tags_id.push( tag_id )
                }

                company.tags = tags_id;
                company.save(function(err, company){
                    if (err)
                        res.send(err);

                    res.json(company);
                })
    });