【问题标题】:Node.js mongoDB Issue with pushing new elements to already existing objectNode.js mongoDB 将新元素推送到现有对象的问题
【发布时间】:2020-10-16 16:49:19
【问题描述】:

我是如何做到的,所以当我提交到我的数据库时,它会将它添加到具有相同名称的对象中?我想要它,以便当我在同一日期提交一个数组时,它们会在同一个对象下。当我尝试时,它会自动在父元素和我正在添加的元素之间添加一个对象。

MongoDB adds this object between the elements I want.

我试着到处寻找,但能找到任何帮助。

我的代码:

   app.post('/add-submit', (req,res) => {
    var query = { username: req.body.username };
    db.collection("users").find(query).toArray((err, result) => {
        if (err) throw err;
        console.log(result);
    });
                 
    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

    pushValue = {"submits": {[postDate]: { [subject] : [ time = req.body.time, description = req.body.description, date = postDate ]}}}

    console.log(pushValue)

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

我正在尝试做的事情:

谢谢。

【问题讨论】:

  • 我不太清楚你想要实现什么。 The $push operator appends a specified value to an array. 所以你每次点击这个端点时都会推送新对象。查看屏幕截图,这正是我所期望的。但既然你在问,这可能不是你所期望的。您到底期望会发生什么?
  • 您希望文档在您到达端点后会是什么样子?尝试在问题中添加预期的文档。
  • 我有一个对象,它被命名为它被放入数据库的日期,我想在以日期命名的对象的不同后请求上添加多个元素。但它总是会创建一个新对象。我不是很有经验,抱歉。
  • 我在下面贴了一些建议,如果有帮助请告诉我
  • 请接受正确答案,如果仍有遗漏,请提供反馈!

标签: node.js json mongodb express


【解决方案1】:

我试着给出一些建议。由于 OP 提到他在这方面没有经验,我建议使用库 mongoose。对我来说,它是使用 NodeJS 和 MongoDB 时的首选库。即使是初学者也很容易设置和使用。

现在,问题来了:

使用多个模型

尽量不要将所有内容都放入一个文档模型中。有一个术语叫'One-To-Many'-Relationship。您的用例将是一个完美的例子:

  • 我可以将一个用户映射到多个提交,但一个提交只能映射到一个特定用户。
  • 用 MongoDB 术语来说,这意味着 user 有多个 submit 实体,并且
  • 并且submit 文档对一个用户有一个引用。

在简化模型中会是什么样子(使用 Mongoose)


const UserSchema = new Schema ({
  username : String,
  email : String,
  password : String,
  submits: [{ type: Schema.Types.ObjectId, ref: 'Submit', 'default' : [] }],
});

const SubmitSchema = new Schema ({
  date : Date,
  subject : String,
  description : String,
  user : { type: Schema.Types.ObjectId, ref: 'User', 'default' : null }
});

这将导致数据看起来像这样(如果使用填充)

// retrieve user and all its submits
let user = await User.findById(userid).populate('submits').exec();
console.log( user.submits );
{
  date : "Mon Oct 18 2020 11:36:49",
  subject : "This is the subject",
  description : "This is the description",
  user : "595919bdbcb1b19",
  _id : "5482193857cbc818bc1912"
}, 
{
  date : "Mon Oct 18 2020 11:50:23",
  subject : "This is the subject",
  description : "This is the description",
  user : "595919bdbcb1b19",
  _id : "29299cbca9192bdcabbb"
},
{
  date : "Mon Oct 19 2020 17:24:11",
  subject : "This is the subject",
  description : "This is the description"
  user : "595919bdbcb1b19",
  _id : "5521545b5c5b5aa5125"
},
{
  date : "Mon Oct 20 2020 20:11:57",
  subject : "This is the subject",
  description : "This is the description"
  user : "595919bdbcb1b19",
  _id : "51525235cbba51b15522"
}

这些“提交”文档可以很容易地按日期和/或时间排序,例如,甚至是客户端。这实际上也简化了结构,您不需要单独的日期和时间。而且这种方式更容易修改或删除单个提交。

也可以直接查询submits,像这样(简体)

这样的事情会给你一个特定日期和特定用户的所有帖子:


let submits = await Submit.find({
  user : userid,
  date : new Date('2020-10-19')
}).exec();

【讨论】:

    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2020-07-08
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多