Удаление поддокумента в мангусте - PullRequest
0 голосов
/ 11 января 2019

У меня есть такая модель:

 const Screen = new Schema(
    {
        userId: [
            {
                type: ObjectId,
                default: null
            }
        ],
        contents: [
            {
                content: {
                    type: ObjectId,
                    ref: "Content",
                    default: null
                }
            }
        ],
    },
    { strict: false }
);

и я хочу удалить содержимое в subcdoc содержимого, и я написал это так:

screenModel
    .find({ screenCode: screenCode })
    .lean()
    .exec()
    .then(screen =>
    {
        const newScreen = screen;
        newScreen.contents.id(_id).remove();
        screenModel.replaceOne(screen, newScreen);
        return newScreen;
    })

но мне возвращается эта ошибка:

"Ошибка: невозможно прочитать свойство 'id' из неопределенного
в APIError.ExtendableError (D: \ Projelerim \ React \ adonis-api-v1 \ workspace \ dist \ api \ helpers \ APIError.js: 35: 11)
в новом APIError (D: \ Projelerim \ React \ adonis-api-v1 \ workspace \ dist \ api \ helpers \ APIError.js: 63: 101)
в D: \ Projelerim \ React \ adonis-api-v1 \ workspace \ dist \ config \ express.js: 129: 20
в Layer.handle_error (D: \ Projelerim \ React \ adonis-api-v1 \ workspace \
ode_modules \ экспресс \ Lib \ маршрутизатор \ layer.js: 71: 5)
в trim_prefix (D: \ Projelerim \ React \ adonis-api-v1 \ workspace \
ode_modules \ экспресс \ Lib \ маршрутизатор \ index.js: 315: 13)
в D: \ Projelerim \ React \ adonis-api-v1 \ workspace \
ode_modules \ экспресс \ Lib \ маршрутизатор \ index.js: 284: 7
в Function.process_params (D: \ Projelerim \ React \ adonis-api-v1 \ workspace \
ode_modules \ экспресс \ Lib \ маршрутизатор \ index.js: 335: 12)
в следующем (D: \ Projelerim \ React \ adonis-api-v1 \ workspace \
ode_modules \ экспресс \ Lib \ маршрутизатор \ index.js: 275: 10)
в D: \ Projelerim \ React \ adonis-api-v1 \ workspace \
ode_modules \ экспресс \ Lib \ маршрутизатор \ index.js: 635: 15
в Immediate.next (D: \ Projelerim \ React \ adonis-api-v1 \ workspace \
ode_modules \ экспресс \ Lib \ маршрутизатор \ index.js: 260: 14)
в Immediate._onImmediate (D: \ Projelerim \ React \ adonis-api-v1 \ workspace \
ode_modules \ экспресс \ Lib \ маршрутизатор \ index.js: 635: 15)
при runCallback (timers.js: 706: 11)
в tryOnImmediate (timers.js: 676: 5)
в processImmediate (timers.js: 658: 5)
at process.topLevelDomainCallback (domain.js: 121: 23)

Схема выглядит так:

"contents":[  
  {  
     "content":{  
        "$oid":"5c38a45c7bb5f232d4c3233c"
     },
     "_id":{  
        "$oid":"5c38ad1a994d6b436826778d"
     }
  },
  {  
     "content":{  
        "$oid":"5c38a45c7bb5f232d4c3233c"
     },
     "_id":{  
        "$oid":"5c38ad3d994d6b436826778e"
     }
  }

]

Что не так с этим кодом? Я попытался изменить id (), чтобы тянуть (), и это также дает ошибку Пожалуйста, помогите мне: (

1 Ответ

0 голосов
/ 11 января 2019

Надеюсь, вы знаете, как работает худой .lean().

Документы, возвращаемые из запросов с включенной опцией lean, являются обычными объектами javascript, а не MongooseDocuments. У них нет метода сохранения, методов получения / установки или другой магии Мангуста.


Отладка вашей ошибки,

Невозможно прочитать свойство 'id' из неопределенного

Очевидно, в этот момент происходит сбой newScreen.contents.id
Пожалуйста, добавьте console.log(), чтобы проверить, является ли screen полученный в then тем, что вы ищете.

ИМХО, screen - это Array, который содержит ваши экраны, так что вы должны повторить его.
Как это:

for (const sc of screen) { ...your logic with removing }
...