Я пытаюсь выполнить обновление документа MongoDB (используя mongoose), сначала используя .findById для получения документа, а затем обновляя поля в этом документе новыми значениями. Я все еще немного новичок в этом, поэтому я использовал учебник, чтобы понять, как заставить его работать, затем я обновлял свой код для своих нужд. Вот учебник: MEAN App Учебник с Angular 4 . В исходном коде была определена схема, но мое требование - общий интерфейс MongoDB, который будет просто принимать любую полезную нагрузку, отправляемую ему, и отправлять ее в MongoDB. Оригинальный урок имел что-то вроде этого:
exports.updateTodo = async function(todo){
var id = todo.id
try{
//Find the old Todo Object by the Id
var oldTodo = await ToDo.findById(id);
}catch(e){
throw Error("Error occured while Finding the Todo")
}
// If no old Todo Object exists return false
if(!oldTodo){
return false;
}
console.log(oldTodo)
//Edit the Todo Object
oldTodo.title = todo.title
oldTodo.description = todo.description
oldTodo.status = todo.status
console.log(oldTodo)
try{
var savedTodo = await oldTodo.save()
return savedTodo;
}catch(e){
throw Error("And Error occured while updating the Todo");
}
}
Однако, поскольку я не хочу схемы и хочу что-либо пропустить, я не хочу присваивать статические значения конкретным именам полей, таким как заголовок, описание, статус и т. Д. Итак, я придумал это :
exports.updateData = async function(update){
var id = update.id
// Check the existence of the query parameters, If they don't exist then assign a default value
var dbName = update.dbName ? update.dbName : 'test'
var collection = update.collection ? update.collection : 'testing';
const Test = mongoose.model(dbName, TestSchema, collection);
try{
//Find the existing Test object by the Id
var existingData = await Test.findById(id);
}catch(e){
throw Error("Error occurred while finding the Test document - " + e)
}
// If no existing Test object exists return false
if(!existingData){
return false;
}
console.log("Existing document is " + existingData)
//Edit the Test object
existingData = JSON.parse(JSON.stringify(update))
//This was another way to overwrite existing field values, but
//performs a "shallow copy" so it's not desireable
//existingData = Object.assign({}, existingData, update)
//existingData.title = update.title
//existingData.description = update.description
//existingData.status = update.status
console.log("New data is " + existingData)
try{
var savedOutput = await existingData.save()
return savedOutput;
}catch(e){
throw Error("An error occurred while updating the Test document - " + e);
}
}
Моя первоначальная проблема заключалась в том, что у меня было много проблем с получением новых значений для замены старых. Теперь, когда это было решено, я получаю сообщение об ошибке «TypeError :istingData.save не является функцией». Я думаю, что тип данных изменился или что-то, и теперь это не принимается. Когда я раскомментирую статические значения, которые были в старом учебном коде, это работает. Это также поддерживается регистрацией в моей консоли до и после того, как я присоединяюсь к объектам, потому что первый печатает фактические данные, а второй печатает [объект Object]. Тем не менее, я не могу понять, чего он ожидает. Любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ: Я понял это. Очевидно, у Mongoose есть собственный тип данных «Модель», который изменяется, если вы делаете что-то безумное с базовыми данными, используя такие вещи, как JSON.stringify. Я использовал Object.prototype.constructor, чтобы выяснить фактический тип объекта следующим образом:
console.log("THIS IS BEFORE: " + existingData.constructor);
existingData = JSON.parse(JSON.stringify(update));
console.log("THIS IS AFTER: " + existingData.constructor);
И я получил это:
THIS IS BEFORE: function model(doc, fields, skipId) {
model.hooks.execPreSync('createModel', doc);
if (!(this instanceof model)) {
return new model(doc, fields, skipId);
}
Model.call(this, doc, fields, skipId);
}
THIS IS AFTER: function Object() { [native code] }
Который показал мне, что на самом деле происходит. Я добавил это, чтобы исправить это:
existingData = new Test(JSON.parse(JSON.stringify(update)));
В соответствующей заметке мне, вероятно, следует просто использовать собственный драйвер MongoDB на данный момент, но он работает, поэтому я просто покажу его в своем списке дел.