У меня есть следующая схема 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;
Мой вопрос: почему не работает настройка всего объекта?