带有前面的验证命令的创建命令上的 MongoDB 数据完整性

发布于 2024-10-15 18:07:52 字数 419 浏览 8 评论 0原文

我正在创建的网站允许用户在网站上拥有唯一的子域,例如; gaz123.mywebsite.com。

他们在网站上注册时输入自己的子域。在创建帐户记录之前的代码中,我检查他们选择的子域是否尚不存在。这只是针对具有相同子域的帐户的简单查询。如果这返回零计数,那么我将继续并使用该子域创建帐户。

我在两个 MongoDB 命令周围放置了一个 lock() 命令,即;检查子域是否可用,然后创建帐户。然后我释放锁。

lock( m_oLockMe)
{
    if( SubdomainIsFree( oRegisterModel.SubDomain))
    {
        CreateAccount( oRegisterModel);
    }
}

你会这样做吗?还有其他更好的方法吗?为什么?

谢谢

A website I'm creating lets users have a unique subdomain on the site eg; gaz123.mywebsite.com.

They enter their subdomain when they register on the site. In the code before I create the account record I check that the subdomain they've chosen doesn't already exist. This is just a simple query against accounts with the same subdomain. If this returns a zero count then I proceed and create the account with that subdomain.

I have placed a lock() command around the two MongoDB commands ie; check that the subdomain is available and then create the account. Then I release the lock.

lock( m_oLockMe)
{
    if( SubdomainIsFree( oRegisterModel.SubDomain))
    {
        CreateAccount( oRegisterModel);
    }
}

Is this how you would do it? Is there another way that is better? Why?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

弥枳 2024-10-22 18:07:52

这不是一个好方法——你会在这里失去可扩展性。我会使用原子 findAndModify 来完成此操作。首先,您需要在 subdomain 字段上建立唯一索引:

db.subdomains.ensureIndex({subdomain: 1}, {unique: true})

这是更新插入不生成重复项所必需的。然后您将执行以下操作:

r = db.subdomains.findAndModify({query: {used: false, subdomain: <subdomain>}, update: {$set: {used: true}}, new: true, upsert: true})

这将返回代表自由子域的文档,或者抛出重复键错误,这意味着子域已被使用。对于免费子域,这还会自动将 used 设置为 true,因此保证只有单个 findAndModify 操作才能获取相同的文档。

This is not a good way - you lose scalability here. I'd do this with atomic findAndModify. First you'll need to establish unique index on subdomain field:

db.subdomains.ensureIndex({subdomain: 1}, {unique: true})

This is needed for upsert to not generate duplicates. Then you'll do this:

r = db.subdomains.findAndModify({query: {used: false, subdomain: <subdomain>}, update: {$set: {used: true}}, new: true, upsert: true})

This will either return document which represents free subdomain or throw duplicate key error which means the subdomain is used. For free subdomain this will also atomically set used to true so it's guaranteed only a single findAndModify operation will get the same document.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文