使用节点将对象数组保存到 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 数据库,表达的主要内容,如果未能解决你的问题,请参考以下文章