【问题标题】:How do i $push to a object in an array in a mongoDB database with node?我如何 $push 到带有节点的 mongoDB 数据库中的数组中的对象?
【发布时间】:2020-10-17 11:14:41
【问题描述】:

我想将一个对象推送到我的 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...

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

谢谢。

【问题讨论】:

    标签: node.js arrays json mongodb express


    【解决方案1】:

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

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

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

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

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

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

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

    对了,我已经回复了here的查询

    【讨论】:

    • 我按照您说的做了,没有出现任何错误,但数据库上没有任何显示。我应该已经在数据库中拥有数组和对象以使其工作还是自动创建它们?
    • 必须存在,因为查询更新匹配第一个对象(用户名和submits.date)的元素。因此,如果没有找到任何元素,则不会更新任何元素。
    • 我如何检查它是否不存在,然后我该怎么办?
    • 首先请告诉我我将如何创建它:) 它不会神奇地进入数据库我不知道如何将它放在首位。当我尝试时,它会在我要添加的对象之间添加随机对象。如何在数据库上创建一个对象,然后我可以使用您提供的代码添加到该对象中。
    • 请耐心等待。如果您使用的是 Node,您可以选择使用方法 insertOne()insertMany()。您可以查看mongodb documentation
    猜你喜欢
    • 2021-03-12
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2023-01-31
    • 2021-06-27
    • 2021-06-08
    相关资源
    最近更新 更多