【问题标题】:how to dynamically update collection with $inc command如何使用 $inc 命令动态更新集合
【发布时间】:2017-05-02 21:45:35
【问题描述】:

我有这个 mongo 集合 opponents 来存储每个玩家的对手详细信息

{username:foo, foo:{foo1:0,foo2:0,foo3:0}} 
{username:foo1,foo1:{foo:0,foo2:0,foo3:0}}
{username:foo2,foo2:{foo:0,foo1:0,foo3:0}}//i.e player foo2 play 0 games with foo,foo1 and foo3

还有这个 tableobject 在 node.js 服务器端:

 var table =[{name:"foo",rounds:3},{name:"foo1",rounds:3},{name:"foo2",rounds:3},{name:"foo3",rounds:3}] //all players' name in a table with their rounds number

对于表中的每个玩家,我想将他们对手的名字和回合相应地附加到opponent集合中(当然不需要附加自己)。期望的结果是:

{username:foo, foo:{foo1:3,foo2:3,foo3:3}}
{username:foo1,foo1:{foo:3,foo2:3,foo3:3}}
{username:foo2,foo2:{foo:3,foo1:3:foo3:3}}
{username:foo3,foo3:{foo:3,foo1:3,foo2:3}}

我有一个自定义函数fun(name) 来为每个玩家返回一个他们对手名字的数组。所以fun(table[0].name) 会返回[foo1,foo2,foo3]

function fun(name){
  var result = [];
    for (var i = 0; i <players.length; i++){
       if(players[i].name!=name){
         result.push(players[i].name)
         }
      }
        return result;
 }

这是我当前的代码:

     for (var i =0;i<table.length;i++){
      db.opponents.update({username:table[i].name},{$inc:{[table[i].name + '.' + fun(table[i].name)[0] ] :table[i].rounds}})
      if (table.length>2){
      db.opponents.update({username:table[i].name},{$inc:{[table[i].name + '.' + fun(table[i].name)[1] ] :table[i].rounds}})
    }
     if (table.length>3){
      db.opponents.update({username:table[i].name},{$inc:{[table[i].name + '.' + fun(table[i].name)[2] ] :table[i].rounds}}) 
    }

但它是严格的硬编码,如果table.length 增加,我需要更多的代码行。如何使用变量使其更紧凑?我尝试使用嵌套循环,但这让情况变得更糟。

【问题讨论】:

    标签: javascript node.js mongodb loops mongojs


    【解决方案1】:

    问题解决了:

    for (var i = 0; i < table.length; i++) {
       db.opponents.update({username:table[i].name},{$inc:{[table[i].name + '.' + fun(table[i].name)[0] ] :table[i].rounds}})
        for (var j = 1;j<fun(table[i].name).length;j++){
          db.opponents.update({username:table[i].name},{$inc:{[table[i].name + '.' + fun(table[i].name)[j] ] :table[i].rounds}})
         }
      }
    

    【讨论】:

      猜你喜欢
      • 2022-12-12
      • 1970-01-01
      • 2011-03-08
      • 2020-04-20
      • 2018-09-23
      • 2020-07-22
      • 2018-04-26
      • 2022-12-03
      • 2014-12-12
      相关资源
      最近更新 更多