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文档中找,没找见,如果你知道请指导一下咯,或者有别的包告诉我一下也行


10 回复

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);
    }
});

解释

  1. 定义 Schema

    • 我们首先定义了一个 PilotSchema,它描述了 Pilot 文档的结构。
  2. 创建 Model

    • 使用 mongoose.model 方法将 PilotSchema 映射到 Pilot 集合。
  3. 构造函数

    • Pilots 构造函数接收一组 JSON 对象,并将其存储在 this.jsonObjs 属性中。
  4. 批量保存方法

    • saveAll 方法用于批量保存 Pilot 对象。
    • 使用 map 方法将 JSON 对象转换为 Pilot 实例。
    • 调用 Pilot.insertMany 方法批量保存这些实例。insertMany 是 Mongoose 提供的一个高效批量插入方法。
  5. 使用示例

    • 创建一个包含多个 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()方法,使代码更加简洁和高效。

回到顶部