Javascript 查找数据库相关问题
我一直在编写代码将信用从一个用户转移到另一个用户,我选择MongoDB作为数据库。但我被告知transferCredits函数中存在与数据库相关的问题。我一直在搜索,但找不到任何问题Javascript 查找数据库相关问题,javascript,mongodb,database,Javascript,Mongodb,Database,我一直在编写代码将信用从一个用户转移到另一个用户,我选择MongoDB作为数据库。但我被告知transferCredits函数中存在与数据库相关的问题。我一直在搜索,但找不到任何问题 function transferCredits(from, to, amt) { var fromAccount = db.game_accounts.findOne({"name": from},{"credits": 1}); var toAccount = db.game_accounts.find
function transferCredits(from, to, amt) {
var fromAccount = db.game_accounts.findOne({"name": from},{"credits": 1});
var toAccount = db.game_accounts.findOne({"name": to},{"credits": 1});
if (fromAccount.credits < amt) {
throw new BalanceError("not enough balance to transfer credits");
}
db.game_accounts.update({name: from}, {$set: {credits: fromAccount.credits - amt}});
db.game_accounts.update({name: to}, {$set: {credits: toAccount.credits + amt}});
}
db.game_accounts.insert({name: "John", credits: 1000});
db.game_accounts.insert({name: "Jane", credits: 1000});
// John transfers credits to Jane
transferCredits("John", "Jane", 100);
功能转移积分(从、到、金额){
var fromcount=db.game_accounts.findOne({“name”:from},{“credits”:1});
var toAccount=db.game_accounts.findOne({“name”:to},{“credits”:1});
如果(从Account.credits<金额){
抛出新余额错误(“余额不足,无法转移贷项”);
}
更新({name:from},{$set:{credits:fromcount.credits-amt});
更新({name:to},{$set:{credits:toAccount.credits+amt}});
}
db.game_accounts.插入({姓名:“John”,学分:1000});
db.game_accounts.insert({姓名:“Jane”,学分:1000});
//约翰把学分转给简
转让信用(“约翰”,“简”,100);
您没有告诉我们问题出在哪里,因此我们只能推测
我看到的是,这部分可能是错误的:
db.game_accounts.update({name: from}, {$set: {credits: fromAccount.credits - amt}});
db.game_accounts.update({name: to}, {$set: {credits: toAccount.credits + amt}});
这是因为findOne()
和update()
之间可能发生另一个事务。您最好使用$inc
,它将执行相同的操作,但不会对比赛条件开放
db.game_accounts.update({name: from}, {$inc: {credits: amt*-1}},function(err,res){
if (err) throw err;
db.game_accounts.update({name: to}, {$inc: {credits: amt}}, function(err,res){
if (err) throw err;
db.game_accounts.update({name: from}, {$inc: {credits: amt}});
});
});
请注意,要进行减法运算,我只需乘以-1即可将数字变成负数
除此之外,如果用户试图给另一个用户-10信用,他将能够窃取10信用代替。。。为了确保交易有效,还需要进行其他多项检查
另一方面,MongoDB并不适用于此类事务,您可能更喜欢使用另一种DB,它可以确保数据是最新的,所有操作都是跟踪和完成的。您没有告诉我们问题出在哪里,因此我们只能推测 我看到的是,这部分可能是错误的:
db.game_accounts.update({name: from}, {$set: {credits: fromAccount.credits - amt}});
db.game_accounts.update({name: to}, {$set: {credits: toAccount.credits + amt}});
这是因为findOne()
和update()
之间可能发生另一个事务。您最好使用$inc
,它将执行相同的操作,但不会对比赛条件开放
db.game_accounts.update({name: from}, {$inc: {credits: amt*-1}},function(err,res){
if (err) throw err;
db.game_accounts.update({name: to}, {$inc: {credits: amt}}, function(err,res){
if (err) throw err;
db.game_accounts.update({name: from}, {$inc: {credits: amt}});
});
});
请注意,要进行减法运算,我只需乘以-1即可将数字变成负数
除此之外,如果用户试图给另一个用户-10信用,他将能够窃取10信用代替。。。为了确保交易有效,还需要进行其他多项检查
另一方面,MongoDB并不适用于此类事务,您可能更喜欢使用另一种DB,它可以确保数据是最新的,并且所有操作都是跟踪和完成的。无论谁告诉您,都可以更具体地说“事务”通常需要,以确保多个写入操作之间的一致性。然而,他们的特定语言是典型的偏见胡说八道,因为他们推断“数据库”(MongoDB)由于缺乏对事务的支持而无法处理这样的过程。您的“实现”失败了,但在不同的建模中,很可能与MongoDB进行这样的“借贷”平衡交易。你只是换了一种方式,不管是谁告诉你的,都可以说得更具体一些,只要说“事务”就可以确保多个写操作之间的一致性。然而,他们的特定语言是典型的偏见胡说八道,因为他们推断“数据库”(MongoDB)由于缺乏对事务的支持而无法处理这样的过程。您的“实现”失败了,但在不同的建模中,很可能与MongoDB进行这样的“借贷”平衡交易。你只是换了一种方式而已,有什么好猜测的呢?如果你真的理解了这个非常常见的金融系统模式,它基本上意味着你需要一个“对”的分录,即“借记”和“贷记”相同的金额,从一个账户到另一个账户。如评论所述,“数据库相关问题”在MongoDB中是指“交易”或“缺乏交易”。因此,如果你有“两封信”(就像OP的问题和你的回答一样)那么,当其中一个失败时会发生什么呢?如果你要提交答案,你必须首先理解这个问题。我编辑了我的答案,以包括一个,多么幼稚的,相应地处理交易的方法。但我一直说,这纯粹是猜测,这个问题就是关于这个确切的问题……因为还有许多其他可能的问题在给定的代码片段中。从我对这篇文章的阅读来看,我认为您不太了解它。实现这一点的“MongoDB方式”只涉及“一次写入操作”“也许,我不是专家。只是想帮我做点什么,既然你不想给出一个明确的答案,至少有人得试试。。。不?有什么好猜测的?如果你真的理解了这个非常常见的金融系统模式,它基本上意味着你需要一个“对”的分录,即“借记”和“贷记”相同的金额,从一个账户到另一个账户。如评论所述,“数据库相关问题”在MongoDB中是指“交易”或“缺乏交易”。因此,如果你有“两封信”(就像OP的问题和你的回答一样)那么,当其中一个失败时会发生什么呢?如果你要提交答案,你必须首先理解这个问题。我编辑了我的答案,以包括一个,多么幼稚的,相应地处理交易的方法。但我一直说,这纯粹是猜测,这个问题就是关于这个确切的问题……因为还有许多其他可能的问题在给定的代码片段中。从我的阅读来看,我认为您不太了解它。实现这一点的“MongoDB方式”将只涉及“一次写入操作”。也许,我不是专家。我只是想帮助我所知道的,因为您不想给出一个清晰的答案,所以至少有人必须尝试…不?