【发布时间】:2014-09-26 20:09:39
【问题描述】:
有时我需要一个文档存在于数据库中,我很乐意使用现有文档,或者在缺少文档时创建文档,然后使用新文档。
这似乎是一个相当常见的用例,但我查看了 Mongoose docs 并找不到任何东西。
像findOneAndUpdate() 和update() 和upsert: true 这样的Mongoose Collection 方法是关于修改文档的——如果文档存在,我不想修改它,只是获取它的引用。
示例:(为@neillunn 添加)我想添加一个引用“名称”为“foo”的公司的用户。在此之前,我想用{name: 'foo'} 查找一家公司,如果它不存在就创建它。
示例 2:(为@neillunn 添加)我现在用来处理示例场景的代码:
// Find or create an an instance and return a cb with a reference to it.
var findOrCreate = function(model, criteria, cb){
model.update(criteria, criteria, {upsert: true}, function(err, numberAffected, raw){
if ( ! raw.updatedExisting ) {
console.log('Created instance')
} else {
console.log('Found existing instance')
}
model.findOne(criteria, cb)
})
}
注意:findOneAndUpdate() 不起作用,因为它会尝试修改现有文档,并获得“重复键错误索引”
【问题讨论】:
-
不太清楚。您正在寻找正确的东西,但是为什么您只想本质上“查找”它是否存在,而如果不存在则“修改/更新”?差异似乎不言自明。也许更好地解释您的用例。
-
所以你基本上想要实现自动关系?由于猫鼬没有正式或以编程方式支持关系,我认为您需要执行 2 个查询来实现这一点。
-
@Charminbear 不是关系,只是根据需要查找或制作。如果我的示例我找到/创建了一个公司实例,因为我需要引用
company._id,但这只是当前的用例。 -
@mikemaccana: github.com/drudge/mongoose-findorcreate您正在寻找类似的东西?
-
这个问题非常有用的解决方案:stackoverflow.com/a/7592756/4025963
标签: javascript node.js mongodb mongoose