Как добавить объект во вложенный массив в MongoDB и NodeJS

#node.js #reactjs #mongodb #express #mongoose

#node.js #reactjs #mongodb #экспресс #мангуст

Вопрос:

Я понятия не имею, как я могу поместить объект во вложенный массив

это документ Совета директоров:

 {
    "boardMembers": [
        "5f636a5c0d6fa84be48cc19d"
    ],
    "boardLists": [
        {
            "cards": [],
            "_id": "5f6387e077beba2e3c15d15a",
            "title": "list one",
            "__v": 0
        }
    ],
    "_id": "5f63877177beba2e3c15d159",
    "boardName": "board1",
    "boardPassword": "123456",
    "boardCreator": "5f636a5c0d6fa84be48cc19d",
    "g_createdAt": "2020-09-17T15:57:37.616Z",
    "__v": 2
}

  

Мне нужно отправить задачу внутри массива cards (в определенный список с идентификатором)

вот код:

 outer.post("/add-task/:id", auth, boardAuth, async (req, res) => {
  const listId = req.params.id;

 
    const board = await Board.findOne({ _id: req.board._id });
    if (!board) return res.status(404).send("no such board");

    const list = await List.findOne({ _id: listId });
    if (!list) return res.status(404).send("List not found");

    const task = new Task({
      text: req.body.text,
    });

    board.boardLists.map((list) => {
      if (listId.toString() === list._id.toString()) {
        list.cards.push(task);
      } else {
        console.log("no task");
      }
    });

    await board.save();
    res.send(board);
});
  

теперь проблема в том, что когда я делаю запрос в postman, он показывает мне задачу внутри массива cards, который я хочу, но не сохраняет ее в MongoDB

Ответ №1:

Вы используете array.map() , но:

  1. Ничего не возвращается при обратном вызове map() , который вернет массив с каждым элементом undefined ;
  2. Вы ничему не присваиваете массив, возвращаемый map() .

Таким образом, вы можете использовать array.map() для возврата массива, в котором task помещается во вложенный список board.boardLists , вот так:

 board.boardLists = board.boardLists.map((list) => {
  if (listId.toString() === list._id.toString()) {
    return {
      ...list,
      cards: list.cards.concat(task)
    }
  } else {
    return list
  }
});
  

Комментарии:

1. просто добавьте «, » после ...list и попробуйте