Arhn - архитектура программирования

Удаление элемента из объекта в MongoDB с помощью Mongoose

Я пытаюсь удалить card из текущего проекта пользователя. Каждая карта следует за CardSchema.

Я создаю канбан-доску — это может быть полезно знать.

Однако мне не удалось удалить карту.

Структура моей базы данных для этого выглядит следующим образом:

"cards": [
    {
        "pending": {
            "cardIDHere": {
                // stuff here
            }
        },
        "inprogress": {},
        "completed": {}
    }
]

// or

project
    | - cards [Array]
        | - 0 [Object]
            | - pending [Object]
                | - cardIDHere [Object]
            | - inprogress [Object]
            | - completed [Object]
   

Другими словами, чтобы добраться до карты нужно: cards.0.<panel-name>.<card-id>.

panel-name является родителем карты: pending и т. д.

Мой код:

exports.updateCardPlace = async(req, res, next) => {
    const parent = await Card.findOne({"id":req.body.id});
    const path = `cards.0.${parent.panel}`;

    try{
        await Card.findOneAndDelete({"id": req.body.id});
        res.status(204).json({
            status: "Success"
        })
    } catch(err){
        res.status(300).json({
            status: "Error",
            message: err.message
        })
    }
}

Обратите внимание, что req.body.id — правильное значение, а parent.panel — допустимое.

Тем не менее, я проверяю это один раз - запрос POST возвращается с кодом 204. Ок, отлично. Однако отображается мое предупреждение об ошибке.

Так вот, перезагружаю - может, удалилось, как и должно было быть.

Нет, все еще там. Попробуем еще раз удалить карту.

Ах, на этот раз ошибка:

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'panel' of null
    at exports.updateCardPlace

Я совершенно не понимаю, о чем идет речь, может ли кто-нибудь мне помочь?

Схема карты:

const cardSchema = new mongoose.Schema({
    summary: String,
    description: String,
    tags: Array,
    urgency: String,
    id: String,
    panel: String
});

Схема проекта:

const projectSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true, 'Project name is required']
    },
    type: String,
    photo: String,
    members: [String],
    code: String,
    cards: [{
        "pending": { 
            type: mongoose.Schema.Types.Object,
            ref: 'Card'
        },
        "inprogress": { 
            type: mongoose.Schema.Types.Object,
            ref: 'Card'
        },
        "issues": { 
            type: mongoose.Schema.Types.Object,
            ref: 'Card'
        },
        "completed": { 
            type: mongoose.Schema.Types.Object,
            ref: 'Card'
        }
    }],
    tags: Object
});

  • Можете ли вы включить схему для Card? 27.12.2020
  • Конечно. Добавление сейчас 27.12.2020
  • Вложен ли cardSchema в другую модель, может быть, Project? Я немного смущен тем, где находится путь cards.0.<panel-name>.<card-id>. 27.12.2020
  • Это. Взгляните сейчас. 27.12.2020
  • Ok. Что касается желаемого результата, как впоследствии будет выглядеть массив cards? Должен ли он удалить весь элемент из массива или поле panel соответствующей карты? 27.12.2020
  • Это удалит элемент в cards[0][panel-name] с именем поля cardID. 27.12.2020
  • Давайте продолжим обсуждение в чате. 27.12.2020

Ответы:


1

Давайте попробуем что-то вроде этого:

const parent = await Card.findOne({"id":req.body.id});

try {
    await Card.findOneAndDelete({"id": req.body.id});
    await Project.updateOne(
        { `cards.${parent.panel}.${req.body.id}`: { $exists: true } },
        { $unset: { `cards.$.${parent.panel}.${req.body.id}`: "" }});
    res.status(204).json({
        status: "Success"
    })
} catch(err){
    res.status(300).json({
        status: "Error",
        message: err.message
    })
}

Посмотрев на этот вопрос, похоже, вам нужно также удалить ссылку на модель Project.

В качестве фильтра я использую { `cards.${parent.panel}.${req.body.id}`: { $exists: true } }}. Я не указал индекс 0, поскольку предполагаю, что в массиве cards может быть более одного элемента. В документе update я использую позиционный оператор $, чтобы сбросить значение поля <panel-name>.<card-id> соответствующего элемента в массиве cards.

26.12.2020

2

возможно, то, что вы хотите, это...

const parent = await Card.findOne({"_id":req.body.id});

обратите внимание на подчеркивание в идентификаторе ('_id')

26.12.2020
  • Привет, id — это отдельное поле. 27.12.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..