当用户保存问题时,问题可以包含一系列“标签”。我想获取该标记数组并检查它们是否存在于标记集合中。如果标签存在,请更新计数,否则,将其添加到集合中。我编写了代码来执行此操作,但它看起来非常冗长。使用mongo / mongoose有更好/更简单/更简洁的方法吗?该功能类似于堆栈溢出如何与其标记一起使用。
apiRouter.post('/', function(req, res) {
var question = new Questions();
question.text = req.body.text;
question.answers = req.body.answers;
question.tech = req.body.tech;
question.tags = req.body.tags;
question.level = req.body.level;
question.createdAt = req.body.createdAt;
question.save(function(err, questions) {
if(err) res.send(err);
res.json({message: "Question was created."});
});
for each(tag in req.body.tags) {
QuestionTags.find({ 'tag': { $regex: new RegExp(tag, "i") } }, function(err, tags) {
if(err) res.send(err);
if(tags.length === 0) {
var tagObj = new QuestionTags();
tagObj = {
tag: tag,
count: 0
}
tagObj.save(function(err, questions) {
if(err) res.send(err);
res.json({message: "Tag created"});
});
} else {
var tagObj = new QuestionTags();
tagObj = tags;
tagObj.count++;
tagObj.save(function(err, questions) {
if(err) res.send(err);
res.json({message: "Tag updated"});
})
}
})
}
});
答案 0 :(得分:1)
使用Mongoose API中的find()
与stream()
时,您可以使用MongoDB $in运算符表达式。 find()
返回一个Query
对象,然后可以使用该对象创建QueryStream
(实现Node.js ReadableStream
接口)。然后,您可以使用.on
来处理每个流事件。
请注意,您不能在$regex
表达式中使用$in
运算符表达式,因此在将数组传递到find()
之前必须先处理它。
apiRouter.post('/', function(req, res) {
var question = new Questions();
question.text = req.body.text;
question.answers = req.body.answers;
question.tech = req.body.tech;
question.tags = req.body.tags;
question.level = req.body.level;
question.createdAt = req.body.createdAt;
question.save(function(err, questions) {
if(err) res.send(err);
res.json({message: "Question was created."});
});
var tagsRegExp = [];
req.body.tags.forEach(function(tag) {
tagsRegExp.push(new RegExp(tag, "i");
}
QuestionTags.find({ 'tag': { $in : tagsRegExp }}).stream()
.on('error', function(err) {
res.send(err);
}).on('data', function(tag) {
if(tag.length === 0) {
var tagObj = new QuestionTags();
tagObj = {
tag: tag,
count: 0
}
tagObj.save(function(err, questions) {
if(err) res.send(err);
res.json({message: "Tag created"});
});
} else {
var tagObj = new QuestionTags();
tagObj = tag;
tagObj.count++;
tagObj.save(function(err, questions) {
if(err) res.send(err);
res.json({message: "Tag updated"});
});
}
});
});