首页 > 解决方案 > 我如何 $push 到带有节点的 mongoDB 数据库中的数组中的对象?

问题描述

我想将一个对象推送到我的 MongoDB 数据库上一个数组中的一个对象。我正在尝试使用 $push submits[postDate] 但它在第一个 "[" 下给了我一条红线。知道如何解决这个问题吗?

我的代码:

        app.post('/add-submit', (req,res) => {

        let postDate = new Date();
        let dd = String(postDate.getDate()).padStart(2, '0');
        let mm = String(postDate.getMonth() + 1).padStart(2, '0');
        let yyyy = postDate.getFullYear();

        postDate = mm + '/' + dd + '/' + yyyy;

        subject = req.body.subject

        let pushValue = {
            time: req.body.time,
            description: req.body.description,
            date: postDate 
        }
            
        console.log(pushValue)

        console.log(postDate)

        let myquery = { username: req.body.username};
        let newvalues = { 
            $push : {
                submits[postDate] : {
                    [subject] : pushValue 
                }
            }                               
        }
        db.collection("users").updateOne(myquery, newvalues, (err, response) => {
            if (err) throw err;
            console.log("1 document updated");
            res.redirect('/users/'+req.body.id)
        });   
    })

但我得到这个错误:

    D:\Users\willi\Documents\Node\StudyWebApp\server.js:186
                submits[postDate] : {
                       ^

SyntaxError: Unexpected token '['
    at wrapSafe (internal/modules/cjs/loader.js:1053:16)
    at Module._compile (internal/modules/cjs/loader.js:1101:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47
[nodemon] app crashed - waiting for file changes before starting...

这就是我希望它在数据库中的样子:

MongoDB数据库

谢谢。

标签: node.jsarraysjsonmongodbexpress

解决方案


您的对象模型不是很清楚,但我认为您需要使用$关键字。

要在“提交”中获得职位,您可以尝试submit[postDate]但没有正确的方法,相反,您需要这样的东西:

db.collection.update({
  "username": "test",
  "submits.date": "16/10/2020"
},
{
  $push: {
    "submits.$.subjects": {
      "subjectName": {
        "time": "1234",
        "description": "desc"
      }
    }
  }
})

我将尝试解释它的工作原理,它非常简单。

第一个对象是您要“指向”的位置。就像一个“发现”,你想做第二部分(推)的地方。因此,使用$运算符,您将在文档的确切部分工作。

所以,第二个对象($pushobject)就是操作。使用submits.$.subjects该操作将在文档的此特定部分完成。

我没有在 Node 中测试过它,但是你的代码有myquerynewvalues变量,所以它应该是相同的并且可以工作。

顺便说一句,我在这里回答了查询


推荐阅读