【问题标题】:Updating the nested array element value in Mongo DB更新 Mongodb 中的嵌套数组元素值
【发布时间】:2020-09-15 19:15:36
【问题描述】:

我是 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 并使用其中的用户 ID 提交分配数组 2) 将该用户的“checked”值更改为“true”

【问题讨论】:

    标签: javascript node.js mongodb mongoose mern


    【解决方案1】:

    您需要使用$[] 标识符。使用update 中的arrayFilters。

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

    如果 Id 是 ObjectIds,您还需要将 Ids 转换为带有 mongoose.Types.ObjectId() 的 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

    【讨论】:

    • 非常感谢您的帮助。它确实为该用户更新了 false true 的值,但它删除了该提交数组中的所有其他记录。
    • @AkshayKankal 奇怪,到底删除了什么?
    • 我在 submittd 数组中有 2 条记录。当我更新 1 个用户的记录时,另一条记录被删除。第一条记录也成功更新了。
    • @AkshayKankal 检查拼写错误,如果没有看到完整的代码,我也帮不了你
    • 非常感谢您的帮助。我刚刚在第一部分添加了 {"assignments._id":mongoose.Types.ObjectId(req.body.assignment_id)} ,它对我来说非常适合。你救了我。
    猜你喜欢
    • 2022-01-22
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2017-01-05
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多