Как запросить и обновить вложенные документы mongodb - PullRequest
0 голосов
/ 12 февраля 2020

Итак, я пытаюсь обновить поддокумент в MongoDB, я использую express, и у меня есть следующий маршрут для поиска точного объекта, который я хочу обновить, в настоящий момент я могу только заменить весь документ новым Во-первых, это нормально, если я оставлю это так или есть операция / функция MongoDB / mon goose, которая может помочь мне просто обновить поля на основе того, что предоставляет пользователь, например, если они просто предоставляют заголовок для быть обновленным или приоритетным. Я знаю, что мне не нужно использовать схему для обновления только одного свойства, я пытаюсь найти альтернативу использованию цепочки операторов if - elseif или switch.

app.put('/updateTodoInProject/:id/:todo_id', (req,res)=>{ //':id' represents the id of the project in which the todo is
    const collection = db.collection('projects');
    const todo = new Todo({title: req.body.title, description: req.body.description, priority: req.body.priority});
    collection.updateOne({_id: mongo.ObjectID(req.params.id),
        todos: {$elemMatch: {_id: mongo.ObjectID(req.params.todo_id)}}
    },{
        $set: {
            "todos.$": todo
        }
    },function(err, results) {
        if (err){
            console.log(err);
            res.send('');
            return
        }
        res.send(results)
    });
});

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

{
 _id: "5e3bf72db5074c1e205409f5",
 todos: [
  {
    _id: "5e42bef746bae7728c68384f",
    title: "cool title 1",
    description: "cool description 2",
    priority: 1
  }
 ],
 title: "hjskadjshd"
}

1 Ответ

0 голосов
/ 12 февраля 2020

Вы можете создать полный объект обновления снаружи на основе данных, введенных пользователем, а затем обновить значения в вашем запросе, например:

app.put('/updateTodoInProject/:id/:todo_id', (req,res)=>{ //':id' represents the id of the project in which the todo is
    const collection = db.collection('projects');
    var updateObj = {'todos.$.title': req.body.title, 'todos.$.description': req.body.description, 'todos.$.priority': req.body.priority};
    collection.updateOne({_id: mongo.ObjectID(req.params.id),
        todos: {$elemMatch: {_id: mongo.ObjectID(req.params.todo_id)}}
    },{
        $set: updateObj
    },function(err, results) {
        if (err){
            console.log(err);
            res.send('');
            return
        }
        res.send(results)
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...