如何使用 NodeJS 将数据添加到 MongoDB 中的数组属性?

Posted

技术标签:

【中文标题】如何使用 NodeJS 将数据添加到 MongoDB 中的数组属性?【英文标题】:How to add data to an array attribute in MongoDB using NodeJS? 【发布时间】:2019-04-14 04:15:10 【问题描述】:

我只是想在文章属性中添加不同文章的标题。 我的user.controller.js文件有这个功能

module.exports.savearticle = (req, res, next) => 
  User.findOneAndUpdate(
    req._id,
    
      $addToSet:  articles: req.body.articles 
    ,
    
      new: true
    ,
    function(err, savedArticle) 
      if (err) 
        res.send("Error saving article");
       else 
        res.json(savedArticle);
      
    
  );
;

我有一个单独的路由器页面index.router.js,其中包含我所有的路由器,其中包括此功能的路由

router.post("/savearticle", ctrlUser.savearticle);

我正在使用 Postman 来测试这个功能。 在表单数据中,我将键设置为articles,将值设置为article1。 我的回答是这样的


    "articles": [
        null
    ]

为什么它是空的? 我已经完成了console.log(req.body.articles),它返回undefined。 为什么是undefined? 不应该是article1吗?

这是我在user.model.js 页面中创建的架构

var userSchema = new mongoose.Schema(
  fullName: 
    type: String,
    required: "Full name can't be empty"
  ,
  email: 
    type: String,
    required: "E-mail can't be empty",
    unique: true
  ,
  password: 
    type: String,
    required: "Password can't be empty",
    minlength: [4, "Password must be atleast 6 characters"]
  ,
  saltSecret: String,
  articles: Array
);

这是user.controller.js文件中的用户注册函数

module.exports.register = (req, res, next) => 
  var user = new User();
  user.fullName = req.body.fullName;
  user.email = req.body.email;
  user.password = req.body.password;
  user.articles = [];
  user.save((err, doc) => 
    if (!err) 
      res.send(doc);
     else 
      if (err.code == 11000) 
        res.status(422).send(["Duplicate email address found."]);
       else return next(err);
    
  );
;

【问题讨论】:

我们怎么知道?您没有向我们展示您传递给 API 的 JSON 正文。据我所知,这与 Mongo 没有任何关系。 好的,我添加了要发送的架构和用户注册。这是你要找的吗? 不完全是。 req.body.articles 是什么?在 mongo 查询中使用 req.body.articlesreq.body 时的值是多少?我敢打赌,这不是你所期望的。 哦。是的,我对此非常陌生,并遵循教程,所以我不能 100% 确定 req.body.articles 是什么。我认为在邮递员中,键值对会将req.body.articles 设置为article1,这又会将article1 添加到数据库中 我认为您需要发布类似"articles": "a":1,"b":2 的 JSON 正文(这使得“文章”而不是“文章”成为一个奇怪的名称。 【参考方案1】:

您正在使用带有无效参数的findOneAndUpdate。首先检查req._id类型(通过debug断点或者console.log(req._id)),如果是string,你应该把它转换成mongoose.mongo.ObjectId

module.exports.savearticle = (req, res, next) => 
  let userId = req._id;
  if((typeof userId) === 'string')
     userId = mongoose.mongo.ObjectId(userId);
  
  User.findOneAndUpdate(
    _id : userId,
    
      $push: articles: $each : req.body.articles   //$each need if  req.body.articles is an array, else use  $push: articles: req.body.articles  instead of
    ,
    new: true,
    function(err, savedArticle) 
      if (err) 
        res.send("Error saving article");
       else 
        res.json(savedArticle);
      
    
  );
;

【讨论】:

【参考方案2】:

你应该做到以下几点:

    将您的 req._id 解析为对象 ID

req._id = mongoose.Types.ObjectId(req._id);

    在 Postman 中,将正文中的数据作为行类型发送,然后从下拉列表中选择 JSON。

注意:如果只希望数组“articles”中的唯一值,请使用#addToSet,否则使用$push

【讨论】:

以上是关于如何使用 NodeJS 将数据添加到 MongoDB 中的数组属性?的主要内容,如果未能解决你的问题,请参考以下文章

nodejs操作mongodb

如何在 NodeJS 中引用我的 MongoDB 数据,然后将其添加到 Discord.JS 消息中?

如何使用nodejs在对话流履行中将数据附加到firebase?

windows下怎么让mongodb关闭

NodeJS express - 如何在路由器内添加会话数据?

如何在node js中解压二进制数据