2016-09-28 35 views
0

我實際上是試圖在我的mongodb數據庫中保存一條新記錄。Node + Mongoose,在保存之前等待結果

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

     }); 
    } 

但是作爲mongoos ËfindOne功能有所回調,環只是保持「循環」,而當company.save()被觸發,無標籤已被添加到該公司..

需要一些幫助來獲得它異步:)謝謝

回答

1

您無需一一找到標籤。在操作使用$象下面這樣:

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

UPDATE

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

不工作,如果oldTags爲空,試圖修復它:) –

+0

那麼他應該在哪裏寫company.save()?外側循環?如果是的話tag.save()會在那段時間完成? – Subin

+0

只需嘗試上面的代碼並將save()放入裏面,因爲它與更多代碼無關。它的異步行爲不會影響流量。併爲公司標籤,將其保存在循環之外。 – Sachin

1

模式您正在查找的是promise.all

var q = require('q'); 
var arr = []; 
for (var i = 0; i < req.body.tags.length; i++) { 
    //check if tag exist and if not create 
    var promise = tag.save(); 
    arr.add(promise) 
} 


q.all(arr).then(function(newArr) { //check what comes in newArr and set it in company tags 
    company.tags.push(newArr); 
    //save company 
}); 
+0

嗯,我想在我的應用程序使用它,但事情是,要找到標記是否存在,我使用mongoose.find()並且它是異步的,這意味着在應用程序在db中找到標記之前調用tag.save()。 - > newArr爲空 –

+0

真的沒關係。按照你的演示。檢查標籤是否存在?在該方法的回調中,如果「不存在並在其回調中添加promise數組」,則創建它。同樣,如果現有更新它並添加到承諾數組 – Subin

+0

因此q.all被觸發時,一個新的承諾? –

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

'var tag = new Tag(); tag.label = label; tag_id = tag._id; tag.save();'tag_id將始終未定義:-) – Subin

+0

不需要,因爲創建對象本身時會創建id:D –