【问题标题】:Prevent Duplicate Documents in MongoDB?防止 MongoDB 中的重复文档?
【发布时间】:2020-07-14 17:38:33
【问题描述】:

我正在尝试找出防止重复文档保存在 MongoDB 中的最佳方法。

现在我的表单从用户那里获取 user_url。逻辑是:

  • 检查 user_url 是否有效。 (dns.lookup)

  • 如果user_url是新的,保存到数据库并返回url_ID。

  • 如果 user_url 是旧的,只返回 url_ID。

我认为我的 2 个选项是:

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

【问题讨论】:

标签: javascript node.js mongodb


【解决方案1】:

最好的选择是findOneAndUpdate 查询带有upsertreturnNewDocument 选项

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 的控制台中返回新文档) - 是否返回旧文档或更新文档 - 如果为 false(默认为 false),则插入的文档将为 null。

【讨论】:

  • 我将 .save 替换为 .findOneAndUpdate。如果记录已经存在(即:www.google.ca),它可以工作,但是当我尝试添加新记录时,它会引发错误。编辑:哦,它将原始记录更新为新计数!然后当我尝试添加一个新项目时,它会感到困惑,因为它也想使用新的计数。 ...我会去尝试解决它。​​
  • @AdamWeiler 对不起Adam,我不太了解count 的逻辑,如果您能提供更多详细信息,我会为您提供帮助
  • tl;dr:现在一切正常。基本上我在数据库中创建了一个缺陷。我有 6 条记录,在工作时我使用了 findOneAndUpdate,不小心给出了一条记录“id=7”。 6 条记录,但“id=7”。 Count 返回存在多少条记录。为了添加新记录,我运行 Count 并加 1,因此它始终是一个新数字。但是,由于我已经使用了“id=7”,因此新记录被拒绝,因为它也需要“id=7”。修复数据库后,一切都很顺利。
【解决方案2】:

而不是使用

 db.insert() 

你应该使用

db.update() 

并指定

$upsert: true

[这里]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2019-03-29
    • 2014-07-30
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多