使用node,express将对象数组保存到mongo数据库

时间:2018-02-09 10:42:47

标签: arrays node.js mongodb express mongoose

我正在尝试将对象数组预加载到MongoDB,如下所示:

如果我一次只做一个对象,下面的代码就可以了。就是这样,

如果我设置:

tmp_obj = { 
  id:1, 
  name: 'Tmp 1' 
}

模型文件

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

var TmpSchema   = new Schema({
    id: Number,
    name: String
});


var Tmp= mongoose.model('Tmp', TmpSchema);
module.exports = Tmp;

路由文件

var express = require('express');
var router = express.Router();
var Tmp = require('../models/tmp');


var tmp_obj = [
  { 
    id:1, 
    name: 'Tmp 1' 
  },
  { 
    id:2, 
    name: 'Tmp 2' 
  },
  { 
    id:3, 
    name: 'Tmp 3' 
  }
];

var tmp = new Tmp(tmp_obj);

tmp.save(function (err) {
  if (err) return console.log(err);

  console.log('tmp saved to the database');
  return res.redirect('/login');
})

如何将一组对象推送到mongo?我还有多个要添加的集合。所以,我可以这样做:

tmp1.save(function (err) {
  if (err) return console.log(err);

  console.log('tmp1 saved to the database');

  tmp2.save(function (err) {
    if (err) return console.log(err);

    console.log('tmp2 saved to the database');
    return res.redirect('/login');
  })
})

2 个答案:

答案 0 :(得分:1)

另一种选择是使用.create()方法,它可以接受一个对象数组或一个对象,而你不需要创建一个模型实例(即var tmp = new Tmp(tmp_obj);),这里是一个例如:

var Tmp = require('../models/tmp');

var tmp_obj = [
    { id:1, name: 'Tmp 1' },
    { id:2, name: 'Tmp 2' },
    { id:3, name: 'Tmp 3' }
];

Tmp.create(tmp_obj, function (err, temps) {

    if (err) {
        console.log(err);
        // terminate request/response cycle
        return res.send('Error saving');
    }

    res.redirect('/login');

});

最后一点,如果发生错误,请不要忘记终止请求/响应周期,否则页面将挂起

答案 1 :(得分:0)

您可以使用mongoose中的方法insertMany一次插入多个文档。

来自mongoose v5.0.4的文档

var arr = [{ name: 'Star Wars' }, { name: 'The Empire Strikes Back' }];

Movies.insertMany(arr, function(error, docs) {});

使用.save()的替代方案是

// Create all objects
const objects = tmp_obj.map(x => new Tmp(x));

try {
   // Saves objects
   const docs = await Promise.all(objects.map(x => x.save()));
} catch(e) {
  // An error happened
}

你不应该使用它,因为insertMany更好