首页 > 解决方案 > 在猫鼬中删除子文档

问题描述

我有一个这样的模型:

 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;
    })

但它返回给我那个错误:

“错误:无法读取
  APIError.ExtendableError (D:\Projelerim\React\adonis-api-v1\workspace\dist\api\helpers\APIError.js:35:11)
  处未定义的属性 'id' 在新 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
  at Layer.handle_error (D:\Projelerim\React\adonis-api-v1\workspace\
ode_modules\express\lib\router\layer.js:71:5)
  at 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
  在 Immediate._onImmediate (D:\Projelerim\React\adonis-api-v1\workspace\
ode_modules\express\lib\router\index.js:260:14)
  在 Immediate._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() 并且它也给出了错误请帮助我:(

标签: node.jsmongodbexpressmongoosesubdocument

解决方案


我希望你知道精益是如何工作.lean()的。

从启用了精简选项的查询返回的文档是纯 javascript 对象,而不是 MongooseDocuments。他们没有应用保存方法、getter/setter 或其他 Mongoose 魔法。


调试你的错误,

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

显然,此时它崩溃了newScreen.contents.id
请添加console.log()以验证screen收到的then内容是否是您要查找的内容。

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

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

推荐阅读