【问题标题】:save array of objects to the mongo database using node, express使用节点将对象数组保存到 mongo 数据库,表达
【发布时间】:2018-07-20 02:51:18
【问题描述】:

我正在尝试将对象数组预加载到 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');
  })
})

【问题讨论】:

    标签: arrays node.js mongodb express mongoose


    【解决方案1】:

    您可以使用 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 更好

    【讨论】:

      【解决方案2】:

      另一种选择是使用.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');
      
      });
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多