Mongoose - Удалить свойство из SubDocument - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть следующие схема и код Mongoose:

Схема:

{
    ...
    inv: {
        type: Object,
        default: {}
    },
    ...
}

Код (версия 1), где targetData - это Mongoose Document, item - это String, а amount - это Number:

targetData.inv[item] = targetData.inv[item] - amount;
if (!targetData.inv[item]) delete targetData.inv[item];
await targetData.save();

Код (версия 2):

targetData.inv[item] = targetData.inv[item] - amount;
if (!targetData.inv[item]) targetData.inv[item] = undefined;
await targetData.save();

Проблемав том, что ни одна из этих попыток не удаляет targetData.inv[item] из документа.Моя цель - удалить элемент, скажем "thing", из вложенного документа.Например:

До:

{
    ...
    inv: {
        thing: 5
    },
    ...
}

После:

{
    ...
    inv: {},
    ...
}

Примечание. Если amount - это число меньше 5 (в приведенном выше примере) код работает нормально.Если я удаляю все 5, вот когда он не обновляется, он остается как 5.

Примечание 2. Я использую Mongoose 5.3.15

Howя могу достичь этого?

РЕДАКТИРОВАТЬ: Похоже, это происходит только в том случае, если inv имеет только 1 свойство.Наличие что-то вроде inv: { thing: 5, anotherThing: 6 } будет отлично работать с ключевым словом delete.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Я знаю, что вы решили проблему, но у меня есть идея.Обычно в этой ситуации я хотел бы получить документ, пройти через объект, найти элемент, удалить его и снова сохранить документ.Это наивный способ, которым я занимаюсь.

0 голосов
/ 29 декабря 2018

Узнал что не так.Все, что мне нужно было сделать, это вручную сообщить Mongoose, что inv был изменен с использованием targetData.markModified("inv"). Docs .Это связано с тем, что SchemaType является Mixed (Object)

...