防止在MongoDB中重复文档?

时间:2019-01-02 02:38:51

标签: javascript node.js mongodb

我正在尝试找出防止重复文档保存在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

2 个答案:

答案 0 :(得分:1)

最好的选择是使用findOneAndUpdateupsert选项的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

[这里]