Почему удаление свойства, вложенного в объект путем замены всего объекта, приводит к тому, что оно становится нулевым, а не исчезает? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть следующая схема Mongoose:

const TestSchema = new Schema(
  {
    object: {
      key: {
        type: String
      },
      key2: {
        type: String
      }
    }
  }
);

mongoose.model('TestModel', TestSchema);

const TestModel = mongoose.model('TestModel');

Я устанавливаю свойство объекта и сохраняю его:

const testDocument = new TestModel({
  _id: ObjectId('507f1f77bcf86cd799439010'),
  object: {
    key: 'key',
    key2: 'key2'
  }
});

await testDocument.save();

Затем я перезагружаю его и меняю этот объект:

const testDocument = await TestModel.findById('507f1f77bcf86cd799439010');

testDocument.set('object', {
  key: 'key changed',
  key2: undefined
});

await testDocument.save();

После того, как я снова перезагружаю его и проверяю на соответствие ожидаемому документу, обнаруживается, что ключу 2 вместо удаления присвоено значение null:

const testDocument = await TestModel.findById('507f1f77bcf86cd799439010');
testDocument.toObject().should.deepEqual({
  _id: ObjectId('507f1f77bcf86cd799439010'),
  object: {
    key: 'key changed'
  },
  __v: 0
});

выход:

AssertionError: expected Object {
...
} to equal Object {
...
} (at object, A has Object { key: 'key changed', key2: null } and B has Object { key: 'key changed' })
      + expected - actual

           ]]
         }
         "object": {
           "key": "key changed"
      -    "key2": [null]
         }
       }

то же самое для:

testDocument.object = {
    key: 'key changed',
    key2: undefined
};

Если я удаляю key2 напрямую (устанавливая его как неопределенное), это работает:

testDocument.object.key = 'key changed';
testDocument.object.key2 = undefined;

Использование непосредственного удаления также не работает (оно сохраняет key2 при предыдущем значении 'key2'):

delete testDocument.object.key2;

то же самое для:

testDocument.object.set('key2', undefined);

это вызывает ошибку 'object.set не является функцией':

const obj = testDocument.get('object');
obj.set('key2', undefined);

это также не меняет key2 вообще:

const obj = testDocument.get('object');
obj.key2 = undefined;

это работает:

const obj = testDocument.object;
obj.key2 = undefined;

Мой вопрос: почему не работает настройка всего объекта?

...