更新 Mongo 数据库中的嵌套数组元素值
Updating the nested array element value in 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)
在前端单击 checked 时,我不想将 "checked" 的值从 "false" 更新为 true。
我的路线是这样的
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 并使用其中的 User ID 提交分配数组
2) 将该用户的 "checked" 值更改为 "true"
您需要使用 $[]
标识符。在 update
.
中使用 arrayFilters
如果 ID 是 ObjectId,您还需要使用 mongoose.Types.ObjectId()
将您的 ID 转换为 Mongodb 对象 ID,否则可能查询工作正常但字段不会更新。
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
我是 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)
在前端单击 checked 时,我不想将 "checked" 的值从 "false" 更新为 true。
我的路线是这样的
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 并使用其中的 User ID 提交分配数组 2) 将该用户的 "checked" 值更改为 "true"
您需要使用 $[]
标识符。在 update
.
如果 ID 是 ObjectId,您还需要使用 mongoose.Types.ObjectId()
将您的 ID 转换为 Mongodb 对象 ID,否则可能查询工作正常但字段不会更新。
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