我正在尝试找出防止重复文档保存在MongoDB中的最佳方法。
现在,我的表单从用户那里获取user_url。逻辑是:
检查user_url是否有效。 (dns.lookup)
如果user_url是新用户,请将其保存到数据库中并返回url_ID。
如果user_url很旧,只需返回url_ID。
我认为我的两个选择是:
var findOneURL = function(user_url, done) {
URL.findOne({
orig_url: user_url
}, (err, data) => {
if (err) {
done(err);
}
done(null, data);
})
}
或
var findEditThenSave = function(user_url, done) {
URL.findById(user_url, (err, data) => {
if (err) {
done(err);
}
data.save((err, data) => {
if (err) {
done(err);
}
done(null, data);
});
})
};
目前还不能很好地工作,但这是实时版本: https://kindly-fisherman.glitch.me/
EDIT2:我认为我现在可以正常工作了。这是我的逻辑:
保存到数据库: dns.lookup-> findByURL-> (如果不存在)-> countURLs-> findAndUpdateURL->返回保存到的内容数据库。
OR -> (如果存在)->返回记录。
从数据库中获取:findByID
答案 0 :(得分:1)
最好的选择是使用findOneAndUpdate
和upsert
选项的returnNewDocument
查询
db.collection.findOneAndUpdate({ orig_url: user_url }, { $set: { orig_url: user_url }}, { upsert: true, returnNewDocument: true })
猫鼬
URL.findOneAndUpdate({orig_url: user_url }, { $set: { orig_url: user_url }}, { upsert: true, new: true }, (err, data) => {
if (err) {
done(err);
}
// data will contain your document
done(null, data);
});
upsert
选项指定是否插入未找到的文档,new
(mongo控制台中的returnNewDocument)-返回旧文档还是更新的文档-如果为false(默认为false),则为null插入的文档。
答案 1 :(得分:0)
代替使用
db.insert()
您应该使用
db.update()
并指定
$upsert: true
[这里]