【问题标题】:generate dynamic fields with mongo (no aggregate)使用 mongo 生成动态字段(无聚合)
【发布时间】:2018-07-13 17:49:45
【问题描述】:

我正在使用 updateOne() 查询来更新我的 Db 中的某些内容。

根据函数返回的值,我将更新不同的字段。所以我尝试动态生成字段以避免多次编写相同的函数。

我的想法是以这种方式将字段存储在模板字符串中:

const expField: string = `teams.${newEvent.data.team}.${newEvent.data.position}`;

然后我用它创建我的查询:

query = {
        $push: {
          evtsGame: newEvent
        },
        $set: {
          expField: goalValue.exp,
          updatedAt: moment().toISOString()
        },
        $inc: {
          scoreField: goalValue.score
        }
      };

但是在测试查询后,我意识到它创建了一个新字段 'expField' 而不是 'teams.team1.attacker' 之类的东西

如何动态生成我的姓名字段?

【问题讨论】:

  • @SergioTulentsev 它有效!谢谢你:)
  • 我会发布这个作为答案然后:)
  • 只是用 [expField] 做的,而不是 [$set]
  • 哦,太好了。不知道。

标签: node.js mongodb typescript


【解决方案1】:

感谢@Sergio Tulentsev 帮助我解决问题,这里是解决方案:

query = {
        $push: {
          evtsGame: newEvent
        },
        $set: {
          [expField]: goalValue.exp,
          updatedAt: moment().toISOString()
        },
        $inc: {
          [scoreField]: goalValue.score
        }
      };

【讨论】:

    【解决方案2】:

    这样做,

     $set: {
              expField: goalValue.exp,
            }
    

    在数据库中,dbEngine假设collection中有一个字段expField,然后给它赋值。 p>

    试试这个解决方案,也许会有所帮助:

    query = {
            $push: {
              evtsGame: newEvent
            },
            $set: {
              updatedAt: moment().toISOString()
            },
            $inc: {
              scoreField: goalValue.score
            }
          };
    query['$set'][evtsGame]=goalValue.exp; // Change Here, It will be dynamic.
    

    【讨论】:

      【解决方案3】:

      您需要强制将expField 解释为一个值,而不是一个名称。不确定在对象文字语法中是否可行,但您总是可以这样做:

      query = {
        $push: {
          evtsGame: newEvent
        },
        $set: {
          updatedAt: moment().toISOString()
        },
        $inc: {
          scoreField: goalValue.score
        }
      };
      
      query['$set'][expField] = goalValue.exp;
      

      【讨论】:

      • 有点。请参阅我的编辑以获取解决方案。谢谢你的帮助:)
      • @FlorentArlandis 将其作为答案发布,而不是添加到问题中。因为那是一个答案。
      猜你喜欢
      • 2017-05-11
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 2021-07-23
      相关资源
      最近更新 更多