簡體   English   中英

更新 Mongo DB 中的嵌套數組元素值

[英]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)

在單擊前端的檢查時,我不想將“檢查”的值從“假”更新為真。

我的路線看起來像這樣

 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

https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#up。 S [%3Cidentifier%3E]

您還需要將您的 Id 轉換為 Mongodb object Id 與mongoose.Types.ObjectId()如果 Ids 是 ObjectIds 有效但字段不會得到更新

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM