Как обновить и удалить элемент из массива в mongoose?

#node.js #mongodb #express #mongoose

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

Вопрос:

У меня есть объект board, и я хочу отредактировать его из express и mongoose, это мой объект:

 "boardMembers": [
        "5f636a5c0d6fa84be48cc19d",
    ],
    "boardLists": [
        {
            "cards": [
                {
                    "_id": "5f7c9b77eb751310a41319ab",
                    "text": "card one"
                },
                {
                    "_id": "5f7c9bb524dd8d42d469bba3",
                    "text": "card two"
                }
            ],
            "_id": "5f7c9b6b02c19f21a493cb7d",
            "title": "list one",
            "__v": 0
        }
    ],
    "_id": "5f63877177beba2e3c15d159",
    "boardName": "board1",
    "boardPassword": "123456",
    "boardCreator": "5f636a5c0d6fa84be48cc19d",
    "g_createdAt": "2020-09-17T15:57:37.616Z",
    "__v": 46
}
  

Теперь это мой код, я пытался сделать это с помощью $pull, но ничего не произошло, когда я проверил его на Postman

 router.put("/delete-task/:list/:task", auth, boardAuth, async (req, res) => {
  const listId = req.params.list;
  const task = req.params.task;

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

  Board.findOneAndUpdate(
    { _id: req.board._id },
    { $pull: { "boardLists.$[outer].cards": { _id: task } } },
    {
      arrayFilters: [{ "outer._id": listId }],
    }
  );
  await board.save();
  res.send(board);
});
  

чего мне здесь не хватает?

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

1. Что такое req.board._id ?

2. У меня есть идентификатор платы в локальном хранилище в качестве токена. board._id — это идентификатор доски, которую я хочу.

Ответ №1:

Надеюсь, это сработает в вашем случае, вам просто нужно преобразовать свои идентификаторы в mongo ObjectId. Итак, ваш код будет выглядеть примерно так:

 import mongoose from "mongoose";

const task = mongoose.Types.ObjectId(req.params.task);
const listId = mongoose.Types.ObjectId(req.params.list);

board = await Board.findOneAndUpdate(
    { _id: req.board._id},
    { $pull: {
           "boardLists.$[outer].cards": { _id: task }
        }
    },
    {
      arrayFilters: [{ "outer._id": listId }],
      returnNewDocument: true
    }
);

res.send(board);
  

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

1. @Timo222 с удовольствием!