使用 Node.js 将数组插入 MongoDB 子文档

Posted

技术标签:

【中文标题】使用 Node.js 将数组插入 MongoDB 子文档【英文标题】:Insert array into MongoDB subdocument with Node.js 【发布时间】:2017-09-14 16:40:11 【问题描述】:

我目前有一个如下所示的架构:

positionsApplied:[
        position_id:String,
        index_position: Number
],

我还有 3 个对象需要插入到我的数据库中:

如何通过 Ajax 调用将这些插入到我的数据库中?到目前为止我尝试过的:

像这样将数据添加到数组中:

["58d6b7e11e793c9a506ffe8f", 0, "58c2871414cd3d209abf4fc1", 1, "58d6b7e11e793c9a506ffe7f", 1]

然后哪个会像这样通过我的 ajax 调用传递?(不确定)

$.ajax(
             url: "/insertPositionIndex",
             type: "POST",
             dataType: "json",
             data: 
                 newarray
             ,
             success: function (data) 
            console.log(data);
          
        )

插入数据库是我卡住的地方,我如何分解数组以便插入它?

app.post('/insertPositionIndex', function(req, res)
var object = req.body.ordered_divs;
console.log(req.body);

      User.update(
         "_id": req.user._id,
         "$push":
            "positionsApplied":
                
                // unsure what to do here?

                
            
        
    ).exec(function (err, result) 
           console.log(result);
           res.send( results: result );
      );
      );

非常感谢任何帮助! * 注意schema中的position_id字段是数组中的div_id,index-position字段也是数组中的index_pos。

用户架构:

    var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var User = new Schema(
    id: String,
    name: String,
    companyname: String,
    password: String,
    email: String,
    username: String,
    location: String,
    role:String,
    teamwork:Number,
    initiative:Number,
    technical_skills: Number,
    communication:Number,
    employees: String,
    profile_image: String,
    biodescription: String,
    twitter: String,
    facebook: String,
    instagram: String,
    linkedin: String,
    biodescription: String,
    positionsApplied:[
                            position_id:String,
                            index_position: Number
    ],
    experience: [
          title: String,
          location: String,
          company: String,
          start: String,
          end:String,
          description:String
  ],
    position: [
                    _id:String,
          title: String,
          location: String,
          start: String,
          term:Number,
          description:String,
          date: type: Date, default: Date.now,
          applied:[
                candidate_id: String,
                profile_image: String,
                location: String,
                name: String,
                _id:String
                        ],
  ],
  education: [
          school: String,
          location: String,
          degree: String,
          start: String,
          end:String,
          description:String,
                    _id:String
  ],

    images: [
                    one: String,
                    two: String,
                    three: String,
                    four: String,
                    five:String,
                    six:String
    ],
);


module.exports = mongoose.model('User', User);

【问题讨论】:

【参考方案1】:

由于您的 Schema 是一个对象数组,而您获取的数据(根据浏览器的控制台)也是一个对象数组,为什么不直接传递该数组本身(在控制台中的那个)浏览器)通过ajax并使用mongodb的$each$push保存到数据库中。

$.ajax(
         url: "/insertPositionIndex",
         type: "POST",
         dataType: "json",
         data: 
             arrayOfObjects
         ,
         success: function (data) 
        console.log(data);
      
    )

app.post('/insertPositionIndex', function(req, res)
var object = req.body.ordered_divs;
console.log(req.body);

      User.update(
         "_id": req.user._id,
         
        "$push":
            
             "positionsApplied":
                $each: req.body.arrayOfObjects
               
            
        
    ).exec(function (err, result) 
           console.log(result);
           res.send( results: result );
      );
);

您必须更改 arrayOfObjects 键以匹配您的架构 positionsApplied 键。

【讨论】:

由于某种原因,我得到了“Unexpected token :”并且它引用了“$each: object”行,我错过了什么吗? 谢谢!当我运行它时,我得到了一个完全空白的对象,但是在控制台中我得到了--->“UnhandledPromiseRejectionWarning: UnhandledPromiseRejectionWarning: Unhandled Promise Rejection (rejection id: 1): MongoError: The argument to $each in $push must是一个数组,但它的类型为 NULL" arrayOfObjects 是否进入您的发布路线?检查console.log(req.body.arrayOfObjects) 中的内容。是NULL吗? position_id 都是用户集合中子文档的一部分,我已更新问题以显示我的用户架构。当我在控制台中登录时,我会取回 position_id 所属的整个文档..所以我基本上会取回 3 个用户,因为我有 3 个文档。 但是我上面贴的错误信息在日志的最后还在!

以上是关于使用 Node.js 将数组插入 MongoDB 子文档的主要内容,如果未能解决你的问题,请参考以下文章

从 Node.js 向 MongoDB 集合插入不同类型的值

无法使用 mongoose、Node.js 将数据插入到 mongoDB 中的 Document 字段中

无法使用 Node.js 和 Mongoose 插入 MongoDB

如何使用node.js中的循环将表单数据保存为对象和对象数组到mongodb?

02_使用Node.js往mongodb插入数据

Node.js + MongoDB:插入一个并返回新插入的文档