Mongoose如何查询多个文档,如果找不到则保存,并返回id?

时间:2015-10-13 00:03:38

标签: node.js mongodb mongoose

我正在尝试创建一个查询来满足以下条件:

  1. 搜索具有指定名称的文件' s'在一个集合中。
  2. 如果集合中不存在具有指定名称的文档,请创建新文档。
  3. 返回._id文件要么是新保存的,要么是新保存的。
  4. 如何在不使用for循环的情况下实现此目的?

    var tagArr = req.body.tags.join()
    
    Tag.find({tagName: {$in: tagArr}}, function(err, docs){
        // find the tag._ids by tagNames
        // if tag not found, create a tag
        // return old and new tag_ids with the tagNames
    }
    

1 个答案:

答案 0 :(得分:1)

您应findOneAndUpdate()使用upsert选项设置为true

var tagArr = req.body.tags.join();
var idArr = [];

tagArr.forEach(function(tag){
    Tag.findOneAndUpdate(
        {tagName: tag}, 
        {tagName: tag}, 
        {upsert: true}, 
        function(err, doc){
            if(!err)
            idArr.push(doc._id);
    }
});

如果没有指定名称的标签,findOneAndUpdate()将创建具有该名称的新标签并将其返回,因此您可以拥有其_id。