【问题标题】:Insert into highly nested document MongoDB插入高度嵌套的文档 MongoDB
【发布时间】:2021-10-04 19:37:07
【问题描述】:

这就是数据库的样子:-

{
"courses" : [
       {
        "course" : "Btech",
        "semesters" : [
            {
                "sem" : 1,
                "subjects" : [ ]
            },
            {
                "sem" : 2,
                "subjects" : [ ]
            }
        ]
    },
    {
        "course" : "MBA",
        "semesters" : [
            {
                "sem" : 1,
                "subjects" : [ ]
            }
        ]
    }
  ]
}

我想在 sem 1 的 btech 课程中插入一个主题(c++),让它看起来像这样:-

 {
    "courses" : [
           {
            "course" : "Btech",
            "semesters" : [
                {
                    "sem" : 1,
                    "subjects" : [
                        "subject" : "C++" // i want to add this 
                    ]
                },
                {
                    "sem" : 2,
                    "subjects" : [ ]
                }
            ]
        },
        {
            "course" : "MBA",
            "semesters" : [
                {
                    "sem" : 1,
                    "subjects" : [ ]
                }
            ]
        }
      ]
    }

到目前为止,我已经编写了这段代码:-

app.get('/insertSubject', async function(req, res)
{

    const subject = new Subject({
        subject : req.body.subject // req.body.subject = btech
    })
    await Padhlo.updateOne(
        {"courses.course": "Btech" , "courses.semesters.sem": 1},
        { $addToSet : { "courses.semesters.$.subjects": subject } },
        function(err)
        {
            if(!err)
            {
                res.status(200).send("OK");
            }
            else
            {
                res.status(404).send(err);
            }
        }
        )
});

但它给了我这个错误:-

UnhandledPromiseRejectionWarning: MongoError: Cannot create field 'semesters' in element 

请帮助我,告诉我哪里出错了。我是 MongoDB 新手,我目前正在使用 MongoDB:5.0.1 版本

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    尝试在您的$addToSet 中使用$[] 作为多个位置元素

    db.collection.update({},
    {
      $addToSet: {
        "courses.$[c].semesters.$[s].subjects": {
          "subject": "C++"
        }
      }
    },
    {
      arrayFilters: [
        {
          "c.course": "Btech"
        },
        {
          "s.sem": 1
        }
      ]
    })
    

    Mongo playground

    Official documentation 的标识符是 $[]

    【讨论】:

    • 这是在 MBA 课程中插入主题,我也想在 Btech 课程中插入主题,但我正在更新查询后数据库的外观问题
    • @Siddharth 对不起我的错。代码已更新为使用标识符进行正确匹配
    • 我还添加了$[]运算符中标识符使用的官方文档链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2021-08-28
    • 1970-01-01
    • 2020-03-27
    • 2013-08-12
    • 2018-03-09
    • 2019-02-27
    相关资源
    最近更新 更多