【发布时间】: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