Я знаю, как обновлять объекты в массиве, например:
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
, содержащая слово, которое я хочу обновить, например: kill. У меня также есть переменная с именем num
, которая будет обновляться.
CurrentStats
содержит полный результат модели.
Я получаю s object by doing:
типа s object by doing:
currentStats [type] ', но как я могу его обновить?
я пробовал:
var x = {};
x[type].cash = num;
x[type].amount = 1;
и {$inc: x}
, но это не сработает.
Как я могу это сделать?
Вы хотите на самом деле сформировать имена полей, используя "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
}
}
Это то, что вы хотите обновить эти свойства и только те свойства при внесении изменений в документ.