使用Mongoose在MongoDB中存储可变长度数组

时间:2018-10-31 12:20:28

标签: node.js mongodb mongoose

我在客户端使用一种表单,用户可以上传任意数量的文件,然后使用axios将其全部发送出去。

在NodeJS中接收它,我正在使用Multer通过req.files获取文件及其信息,像这样:

[ { fieldname: 'file1',
    originalname: 'someimage.jpg',
    encoding: '7bit',
    mimetype: 'image/jpeg',
    destination: './uploads/',
    filename: '71027041755f49366c132555066d5b89',
    path: 'uploads\\71027041755f49366c132555066d5b89',
    size: 69336 } ]

我们可以看到,它是一个数组,可以包含多个文件,这很不错,但这是我的问题。

我想使用Mongoose将这些文件的信息存储在MongoDB中,以便知道文件的调用方式,目标,大小等。

我在Mongoose中定义了一个架构,如下所示:

const someSchema = new Schema({
  files: {
    originalname: String,
    filename: String,
    mimetype: String,
    size: String,
    destination: String,
    path: String
  }
});

但这只会允许我存储一个文件信息。我之前也尝试过:

const someSchema = new Schema({
  files: Array
});

但是这不起作用(TypeError: Cannot set property 'originalname' of undefined)。我还尝试设置Object,这也会出错(TypeError: Cannot read property '0' of undefined)。

顺便说一句,我正在阅读“文件”:

 for (let i = 0; i < req.files.length; i++) {
      someschema.files[i].originalname = req.files[i].originalname;
      someschema.files[i].filename = req.files[i].filename;
      someschema.files[i].mimetype = req.files[i].mimetype;
      someschema.files[i].size = req.files[i].size;
      someschema.files[i].destination = req.files[i].destination;
      someschema.files[i].path = req.files[i].path;
    }

上面的每个req.files[i].XXX都记录下来,一切都按其定义。

有没有办法制作一个可以接受多个“文件”的模式?

换句话说:如果可以的话,有没有一种方法可以创建一个模式来接受带有多个对象的数组?

谢谢。

编辑:我想出了files: [Object],但这也行不通(TypeError)。

2 个答案:

答案 0 :(得分:1)

使用$addToSet将另一个对象推入数组。

您可以使用$push代替$addToSet,但这将允许您插入重复的对象。

模式:

var UserSchema = new Schema({
  files: [{
    originalname: String,
    filename: String,
    mimetype: String,
    size: String,
    destination: String,
    path: String
  }]
});

要将另一个对象插入数组。

let obj = {
  originalname: "11",
  filename: "11",
  mimetype: "11",
  size: "11",
  destination: "11",
  path: "11"
}

User.update({
  _id: mongoose.Types.ObjectId("5bd99f95f255307d51f32578")
}, {
    $addToSet: { files: obj}
}).exec(function(err, updated){
  console.log(updated);
})

=========更新=======

您的someschema.files的长度最小。例如,2的迭代次数比使用i索引的迭代次数更多。请尝试以下:

for (let i = 0; i < req.files.length; i++) {
  let obj = {};
  obj.originalname = req.files[i].originalname;
  obj.filename = req.files[i].filename;
  obj.mimetype = req.files[i].mimetype;
  obj.size = req.files[i].size;
  obj.destination = req.files[i].destination;
  obj.path = req.files[i].path;

  someschema.files.push(obj); // lastly push whole object.
}

答案 1 :(得分:0)

尝试将字段包装在[]

const someSchema = new Schema({
  files: [{
    originalname: String,
    filename: String,
    mimetype: String,
    size: String,
    destination: String,
    path: String
  }]
});