Обновите свойства вложенного документа, используя имя переменной в ключе

1

Я знаю, как обновлять объекты в массиве, например:

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}, но это не сработает.

Как я могу это сделать?

Теги:
mongodb-query

1 ответ

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
  }
}

Это то, что вы хотите обновить эти свойства и только те свойства при внесении изменений в документ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню