【问题标题】:What is the correct way of passing a Mongoose object into the MongoDB underlying connection insert() method将Mongoose对象传递给MongoDB底层连接insert()方法的正确方法是什么
【发布时间】:2014-06-23 01:30:24
【问题描述】:

我需要将数千个文档插入 MongoDB。我想将 Mongoose 用于其转换属性等。但是我不知道如何将生成的实例传递给 MongoDB 连接。我试过这个:

var fs = require('fs');
var mongoose = require('mongoose');
var config = JSON.parse(fs.readFileSync("./config.json"));

mongoose.connect(config.mongoDBUrl);
db = mongoose.connection;
db.once('open', function () {

    var TestSchema = new mongoose.Schema({
        testStr : String
    });

    var Model = mongoose.model('test_schema_2', TestSchema);

    var inst = new Model();
    inst.testStr = "EWAFWEFAW";

    // This works.
    db.collection('test_schema_2').insert({ testStr : 'My Test Str'}, {}, function (err) {
        if (err) {
            console.log(err);
        } else {
            console.log('Written.');
            db.close();
        }
    });

    // This doesn't.
    db.collection('test_schema_2').insert(inst, {}, function (err) {
        if (err) {
            console.log(err);
        } else {
            console.log('Written.');
            db.close();
        }
    });
});

在第二种情况下,我得到:“[RangeError: Maximum call stack size exceeded]”

Mongoose 在幕后打破了什么阻止了它的工作,我怎样才能让它工作?

【问题讨论】:

  • 如果你想要模式验证和转换,你需要使用模型之外的方法。现在,您只是为您的实际插入操作获取底层节点驱动程序的句柄,这些操作本身也不会这样做。 Mongoose 验证仅适用于 .save() 方法调用,因此即使您丢失了 .toObject() 调用并遇到麻烦,仅将其扔到文档实例也无济于事。
  • 那么,Mongoose 是否计划在未来为我们提供批量插入功能,以便他们的库至少有点用处?抱歉,这个话题开始激怒我了。
  • 可能,但实际上你已经被告知两次 你 做错了。如果您只是尝试使用普通的收集方法,那么您应该只是使用普通的对象,或者通过箍跳回以再次转换回普通的对象。我已经说过,你没有得到你认为你从作为 Mongoose 文件中获得的好处。所以简单的答案不是不投。只需将您的数据输入到插入方法甚至是批量 API 方法即可。
  • 明白。然后我会这样做,使用 node.js mongodb 驱动程序创建对象,手动确保所有数据类型正确,然后插入原始对象。这是我完成它的唯一方法,对吧?
  • 您需要原始对象才是重点。 Mongoose 文档中包含的不仅仅是字段。

标签: javascript mongodb mongoose


【解决方案1】:

要保存模型实例,您只需要做

inst.save(function(err) {
    //Do something here
});

【讨论】:

  • 不,我需要使用 insert() 因为最终我想传递一个包含数千个数组的数组,并且我希望写操作尽可能快。 Mongoose 不支持正确的批量插入。
猜你喜欢
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2021-02-20
相关资源
最近更新 更多