Nodejs mongoose 如何 保存一组,是1组,而不是一个对象
Nodejs mongoose 如何 保存一组,是1组,而不是一个对象
这两天在想一个问题,因为mongdb批量插入数据的效率是非常高的,但是mongoose里能不能不要先全部遍历一次,存入到建好对象比如一个数组中,在用save保存呢,感觉多此一举啊。
var Schema =mongoose.Schema;
//创建一个类
var PilotSchema = new Schema({
name:{type:String, index:true},
groups:String
});
//把类映射到db中(a,b)a:db中的文档(表)名,b:类
db.model('Pilot',PilotSchema);
var Pilot=db.model('Pilot');
//构造函数,初始化类
function Pilots(JsonObj){
this.name=JsonObj.name;
this.groups=JsonObj.groups;
}
exports.pilotSave=function(pilots,callback){
var newpilot=new Pilot();
newpilot.name=pilots.name; ------假如pilots是一组对象的话,我就得用循环放进newpilot了
newpilot.groups=pilots.groups;
newpilot.save(function(err){
if(err){
console.log(err);
return callback(err);
}
callback(null);
})
}
可不可以直接 var newpilot =pilots
?
这两天在mongoosejs.com的api文档中找,没找见,如果你知道请指导一下咯,或者有别的包告诉我一下也行
Node.js Mongoose 如何保存一组,而不是一个对象
在使用 Mongoose 进行 MongoDB 操作时,有时候我们希望一次性保存多个对象,而不是逐个保存。这不仅能提高效率,还能简化代码逻辑。以下是如何在 Mongoose 中实现批量保存一组对象的方法。
示例代码
假设我们有一个 Pilot
模型,并且我们有一组 Pilot
对象需要保存到数据库中:
const mongoose = require('mongoose');
// 创建一个 schema
const PilotSchema = new mongoose.Schema({
name: { type: String, index: true },
groups: String
});
// 把 schema 映射到 db 中
const Pilot = mongoose.model('Pilot', PilotSchema);
// 构造函数,初始化模型
function Pilots(jsonObjs) {
this.jsonObjs = jsonObjs;
}
Pilots.prototype.saveAll = function(callback) {
const pilotsToSave = this.jsonObjs.map(jsonObj => new Pilot(jsonObj));
// 批量保存
Pilot.insertMany(pilotsToSave, (err, docs) => {
if (err) {
console.error(err);
return callback(err);
}
callback(null, docs);
});
};
// 使用示例
const pilotData = [
{ name: 'John Doe', groups: 'A' },
{ name: 'Jane Smith', groups: 'B' },
{ name: 'Alice Johnson', groups: 'C' }
];
const pilots = new Pilots(pilotData);
pilots.saveAll((err, savedPilots) => {
if (err) {
console.error('Failed to save pilots:', err);
} else {
console.log('Saved pilots:', savedPilots);
}
});
解释
-
定义 Schema:
- 我们首先定义了一个
PilotSchema
,它描述了Pilot
文档的结构。
- 我们首先定义了一个
-
创建 Model:
- 使用
mongoose.model
方法将PilotSchema
映射到Pilot
集合。
- 使用
-
构造函数:
Pilots
构造函数接收一组 JSON 对象,并将其存储在this.jsonObjs
属性中。
-
批量保存方法:
saveAll
方法用于批量保存Pilot
对象。- 使用
map
方法将 JSON 对象转换为Pilot
实例。 - 调用
Pilot.insertMany
方法批量保存这些实例。insertMany
是 Mongoose 提供的一个高效批量插入方法。
-
使用示例:
- 创建一个包含多个
Pilot
数据的数组pilotData
。 - 使用
Pilots
构造函数创建一个Pilots
实例,并调用saveAll
方法批量保存数据。
- 创建一个包含多个
这种方式避免了手动遍历数组并逐个保存对象的操作,提高了效率和代码的简洁性。
为什么大家看了都不回复呢,是不是这个问题没有实际意义啊?
表示只会用 mongo-lite
…
倒是楼主贴的代码格式全乱, 怪人不回复这说不过去吧… 而且论坛人气也不是很高
哈,我马上改一下格式
当我看见这个问题的时候,我几乎感觉您对mongoose有太多的不熟悉,虽然你尝试去找api,但是该框架的主要组成部分都不太了解,势必会导致你无法定位到你想要的结果。 例如你了解了Schema/Model/Document之间的区别后,就很容易发现你的示例代码中你想通过Dcoument来进行操作。对于Doc的操作当然是单对象操作咯,如果你想一次性操作多个,那么肯定是要找Documents或者DocumentArray对象咯。然后我们是可以找到DocumentArray的,也就找到了create方法,create方法告诉我们,里面的subDoc依然按照他原有的schema定义来构造。那么schema构造出的是什么呢?当然是model咯,因此我们就要去model里找create方法咯。model的create方法案例中不就清晰的写了2个操作数组的案例么?
//Model.create(doc, fn)
//Shortcut for creating a new Document that is automatically saved to the db if valid.
//show code
//Parameters:
// doc <Array, Object...>
// fn <Function> callback
Candy.create({ type: 'jelly bean' }, { type: 'snickers' }, function (err, jellybean, snickers) {
if (err) // ...
});
var array = [{ type: ‘jelly bean’ }, { type: ‘snickers’ }];
Candy.create(array, function (err, jellybean, snickers) {
if (err) // …
});
我觉得是不是应该直接搞个代富文本工具放着算了,我最近写mk都觉得麻烦,用个可视化的工具多方便
var reply='精辟';
强烈收藏,a272121742
,你说的很对,我最然有看api,但是整个了解不到2周时间话说文档太多了也不知道从何入手,非常感谢你的回复啊,这样我与多了些思路了。还有你是深夜给我留言的吗????非常感动哇,哈哈
在Mongoose中,如果你想要批量保存一组对象而不是一个对象,你可以直接使用Model.create()
方法。该方法允许你传入一个包含多个文档的对象数组,并且会自动将这些对象保存到数据库中。
下面是修改后的代码示例:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const PilotSchema = new Schema({
name: { type: String, index: true },
groups: String
});
const Pilot = mongoose.model('Pilot', PilotSchema);
exports.pilotSave = function(pilots, callback) {
Pilot.create(pilots, function(err) {
if (err) {
console.log(err);
return callback(err);
}
callback(null);
});
}
在这个例子中,pilots
应该是一个包含多个Pilot对象的数组,例如:
[
{ name: 'John Doe', groups: 'A' },
{ name: 'Jane Doe', groups: 'B' }
]
这样你就不需要手动逐个创建和保存每个对象,而是可以一次性完成批量保存操作,从而提高性能。
这种方法避免了手动遍历数组并逐个调用save()
方法,使代码更加简洁和高效。