javascript - 更新 Mongo DB 中的嵌套数组元素值
问题描述
我是 MERN 的新手,我为老师创建了一个系统来检查作业。我的架构看起来像这样
const mongoose = require('mongoose')
const xyzSchema = new mongoose.Schema({
user:{
type:mongoose.Schema.Types.ObjectId,
ref:'user_collections'
},
assignments:[{
title_assignment:{
type:String,
required:true
},
description_assignment:{
type:String,
required:true
},
created_at:{
type:Date,
required:true,
default:Date.now()
},
files:[],
submitted:[{
user:{
type:mongoose.Schema.Types.ObjectId,
ref:'user_collections'
},
files:[],
created_at:{
type:Date,
required:true,
default:Date.now()
},
checked:{
type:Boolean,
default:false
}
}],
due_dt:{
type:Date,
required:true
}
}],
})
module.exports = mongoose.model('abc',xyzSchema)
在单击前端的检查时,我不想将“检查”的值从“假”更新为真。
我的路线看起来像这样
router.put('/assignments/check',
auth,
async(req,res)=>{
try {
let check = await Classroom.findOne(
{"assignments._id":req.body.assignment_id,"assignments.submitted.user":req.body.user_id},
{$set:{"assignments.$.submitted.$.checked":"true"}}}
)
res.json(check)
} catch (error) {
console.error(error)
}
})
这段代码对我不起作用。有人可以给我一些建议吗?我想要做的是 1)使用 ID 查找 Aassignment 并使用其中的用户 ID 提交分配数组 2)将该用户的“已检查”值更改为“真”
解决方案
您需要使用$[]
标识符。使用 arrayFilters 在update
.
如果 Id 是 ObjectIds,您还需要将 Ids 转换为 Mongodb 对象 Ids mongoose.Types.ObjectId()
,否则可能是查询没有错误但字段不会更新。
let check = await Classroom.update(
{},
{ $set: {"assignments.$[assign].submitted.$[submitt].checked": "true" }},
{
arrayFilters: [
{
"assign._id": mongoose.Types.ObjectId(req.body.assignment_id)
},
{
"submitt.user": mongoose.Types.ObjectId(req.body.user_id)
}
]
}
标识符仅适用于$
1 级深度,如果更多,则需要使用arrayFilters
推荐阅读
- javascript - 如何在反应中切换模态并传递子道具?
- flutter - 有什么作用?。在飞镖做什么?
- vue.js - 如何在普通的 javascrip 文件中使用 mixins(不是单个文件模板)
- java - dynamodb updateItem中的updateExpression中的“add”和“set”有什么区别以及如何使用它们?
- linux - Linux bash 脚本
- c++ - BCryptGenRandom STATUS_INVALID_HANDLE
- linux - bash脚本用环境变量替换文件中的字符串值
- php - 使用 GD 库将文本转换为图像不起作用
- forms - 为什么 Vuex 状态变量似乎绑定到组件的局部变量?
- laravel - Laravel 5.5:重定向路由并将变量传递给其他路由,然后控制器显示在视图上