我实际上是想在我的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()
被触发时,没有标签被添加到公司..
需要一些帮助才能让它异步:)谢谢
答案 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);
})
});