【问题标题】:Mongoose how do I query for multiple documents, save if not found, and return id?Mongoose如何查询多个文档,如果找不到则保存并返回ID?
【发布时间】:2015-10-13 16:56:31
【问题描述】:
我正在尝试创建一个满足以下条件的查询:
- 在集合中搜索具有指定名称的文档。
- 如果集合中不存在指定名称的文档,则创建新文档。
- 返回文档的 ._id,不管它们是不是新保存的。
如何在不使用 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
}
【问题讨论】:
标签:
node.js
mongodb
mongoose
【解决方案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。