使用变量键名更新子文档属性

时间:2017-09-21 12:21:13

标签: javascript mongodb mongodb-query

我知道如何更新数组中的对象,如下所示:

db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } , 
                {$inc : {"items.$.price" : 1} } , 
                false , 
                true);

但是,我试图当前更新一个对象。

模型:

  boats: {
        cash: {type: Number, default: 0},
        amount: { type: Number, default: 0}
    },
    murder: {
        attempts: {type: Number, default:0},
        failed_attempts: {type: Number, default:0},
        successfull_attempts: {type: Number, default:0},
        cash: {type: Number, default: 0},
        amount: { type: Number, default: 0}
    },
    orgcrime: {
        cash: {type: Number, default: 0},
        amount: { type: Number, default: 0}
    },

我有一个名为type的变量,其中包含我要更新的单词,例如:谋杀。我还有一个名为num的变量,它将更新为值。

CurrentStats包含完整的模型结果。

我得到类型s object by doing: currentStats [type]`,但我该如何更新呢?

我试过:

var x = {};
        x[type].cash = num;
        x[type].amount = 1;

{$inc: x},但那不起作用。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您的意思是使用"Dot Notation"实际形成字段名称,方法是连接密钥的名称:

var type = "murder";

var x = { };

x[type + ".cash"] = 1;
x[type + ".amount"] = 2;

db.bar.update({},{ "$inc": x });

现代ES6符号还允许其他形式,如:

db.bar.update(
  {},
  { 
    "$inc": {
      [type + ".cash"]: 1,
      [`${type}.amount`]: 2
    }
  }
);    

无论哪种形式

{
  "$inc": {
    "murder.cash": 1,
    "murder.amount": 2
  }
}

在更改文档时,您希望更新这些属性,这些属性。