MongoDB Mongoose使用数组保存或更新

时间:2016-03-22 20:10:06

标签: javascript node.js mongodb express mongoose

当用户保存问题时,问题可以包含一系列“标签”。我想获取该标记数组并检查它们是否存在于标记集合中。如果标签存在,请更新计数,否则,将其添加到集合中。我编写了代码来执行此操作,但它看起来非常冗长。使用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"});
                })
            }
        })
    }
});

1 个答案:

答案 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"});
                });
            }
        });
    });