删除猫鼬中的子文档

时间:2019-01-11 15:56:46

标签: node.js mongodb express mongoose subdocument

我有一个这样的模型:

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

我想删除内容子文档中的内容,我这样写:

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 \ express \ lib \ router \ layer.js:71:5)
  在trim_prefix(D:\ Projelerim \ React \ adonis-api-v1 \ workspace \
  ode_modules \ express \ lib \ router \ index.js:315:13)
  在D:\ Projelerim \ React \ adonis-api-v1 \ workspace \
  ode_modules \ express \ lib \ router \ index.js:284:7
  在Function.process_params(D:\ Projelerim \ React \ adonis-api-v1 \ workspace \
  ode_modules \ express \ lib \ router \ index.js:335:12)
  在下一个(D:\ Projelerim \ React \ adonis-api-v1 \ workspace \
  ode_modules \ express \ lib \ router \ index.js:275:10)
  在D:\ Projelerim \ React \ adonis-api-v1 \ workspace \
  ode_modules \ express \ lib \ router \ index.js:635:15
  在Instant.next(D:\ Projelerim \ React \ adonis-api-v1 \ workspace \
  ode_modules \ express \ lib \ router \ index.js:260:14)
  立即发布。_onImmediate(D:\ Projelerim \ React \ adonis-api-v1 \ workspace \
  ode_modules \ express \ lib \ router \ index.js:635:15)
  在runCallback(timers.js:706:11)
  在tryOnImmediate(timers.js:676:5)
  在processImmediate(timers.js:658:5)
  在process.topLevelDomainCallback(domain.js:121:23)

模式如下:

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

]

此代码有什么问题?我已经尝试将id()更改为pull(),它也给出了错误,请帮我:(

1 个答案:

答案 0 :(得分:0)

我希望您知道精益的原理.lean()

  

从启用了lean选项的查询返回的文档是纯JavaScript对象,而不是MongooseDocuments。他们没有应用保存方法,没有使用吸气剂/设置剂或其他猫鼬魔法。


调试错误

  

无法读取未定义的属性“ id”

很明显,它在此时newScreen.contents.id崩溃
请添加console.log(),以验证您在寻找screen中收到的then

恕我直言,screenArray,其中包含您的屏幕,因此,您必须对其进行迭代。
像这样:

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