使用节点将对象数组保存到 mongo 数据库,表达

Posted

技术标签:

【中文标题】使用节点将对象数组保存到 mongo 数据库,表达【英文标题】:save array of objects to the mongo database using node, express 【发布时间】: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');
  )
)

【问题讨论】:

【参考方案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');

);

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

【讨论】:

以上是关于使用节点将对象数组保存到 mongo 数据库,表达的主要内容,如果未能解决你的问题,请参考以下文章

如何使用节点将用户数据对象与令牌一起发送到角度前端?

使用节点将令牌保存在本地存储中

应该使用哪个节点将数据从MQTT代理获取到node - red

如何使用节点将表单数据(文本/纯文本)转换为 json?

Unreal4材质表达式实用表达式类节点讲解0015

为啥MongoDB适合大数据的存储