Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找数据库相关问题_Javascript_Mongodb_Database - Fatal编程技术网

Javascript 查找数据库相关问题

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

我一直在编写代码将信用从一个用户转移到另一个用户,我选择MongoDB作为数据库。但我被告知transferCredits函数中存在与数据库相关的问题。我一直在搜索,但找不到任何问题

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方式”将只涉及“一次写入操作”。也许,我不是专家。我只是想帮助我所知道的,因为您不想给出一个清晰的答案,所以至少有人必须尝试…不?