node.js - 在猫鼬中删除子文档
问题描述
我有一个这样的模型:
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() 并且它也给出了错误请帮助我:(
解决方案
我希望你知道精益是如何工作.lean()
的。
从启用了精简选项的查询返回的文档是纯 javascript 对象,而不是 MongooseDocuments。他们没有应用保存方法、getter/setter 或其他 Mongoose 魔法。
调试你的错误,
无法读取未定义的属性“id”
显然,此时它崩溃了newScreen.contents.id
请添加console.log()
以验证screen
收到的then
内容是否是您要查找的内容。
恕我直言,screen
它Array
包含您的屏幕,因此,您必须对其进行迭代。
像这样:
for (const sc of screen) { ...your logic with removing }
推荐阅读
- reactjs - 如何在反应 konva 中破坏特定层
- plot - 绘制正态分布的概率密度函数,但 y 高于 1?
- python - 有什么方法可以在reportlab中插入圆形照片?
- angular - 在 Angular 中使用 BsDatePickerModule 的开发问题
- spring-security - 未来分配的 Azure AD B2C 不记名令牌“nbf”值
- android - 我该如何解决这个 gradle task assembleDebug 的错误
- azure - How to download artifacts from the last job execution when retrying a job in the same stage using Yaml pipelines?
- html - How can I create this figure?
- reactjs - 在安装了 Material-UI 的 Next.js 项目中导入自定义谷歌字体
- nginx - 如何在 2 个 nginx 服务器之间重定向 nginx 中的代理?