スクレイピングのストレージにMongoDBをなんとなく使っていて、その時にnodejsからmongooseを使ってデータを突っ込んでます。
その時になぜか固まってしまったので、原因を追ってみました。
Mongoose ODM v4.3.4
connection生成して、MongoDBにデータ突っ込もうとしたら止まりました。
試したコマンドとコードは下記の通りです。
$npm i --save mongoose
...
$node -v
v4.1.0
$node src/main.js
mongo connection opened
var mongoose= require("mongoose");
var logger = console;
var db = mongoose.createConnection();
db.on('open', function() {
logger.info("mongo connection opened")
});
db.on('close', function() {
logger.info("mongo connection closed")
});
db.open("mongodb://localhost/test");
var schema = new mongoose.Schema({
id: String
});
mongoose.model("Test", schema);
var Model = mongoose.model("Test");
var m = new Model({
id: "hogehoge"
});
m.save(function(e1) {
e1 && logger.error(e1);
Model.count({}, function(e2, count) {
e2 && logger.error(e2);
logger.info(count);
mongoose.disconnect();
});
});
原因(?)と対策
その1
コネクションを作った場合、そのコネクションからモデルを取得しないといけないようです。
var Model = mongoose.model("Test");
ではなく var Model = db.model("Test");
にします。
var mongoose= require("mongoose");
var logger = console;
var db = mongoose.createConnection();
db.on('open', function() {
logger.info("mongo connection opened")
});
db.on('close', function() {
logger.info("mongo connection closed")
});
db.open("mongodb://localhost/test");
var schema = new mongoose.Schema({
id: String
});
mongoose.model("Test", schema);
var Model = db.model("Test");
var m = new Model({
id: "hogehoge"
});
m.save(function(e1) {
e1 && logger.error(e1);
Model.count({}, function(e2, count) {
e2 && logger.error(e2);
logger.info(count);
mongoose.disconnect();
});
});
$node src/main.js
mongo connection opened
9
mongo connection closed
その2
そもそもコネクションはmongooseオブジェクトが持っているようなので、それを使いましょう。
var db = mongoose.createConnection();
を var db = mongoose.connection;
に変えます。
var mongoose= require("mongoose");
var logger = console;
var db = mongoose.connection;
db.on('open', function() {
logger.info("mongo connection opened")
});
db.on('close', function() {
logger.info("mongo connection closed")
});
db.open("mongodb://localhost/test");
var schema = new mongoose.Schema({
id: String
});
mongoose.model("Test", schema);
var Model = mongoose.model("Test");
var m = new Model({
id: "hogehoge"
});
m.save(function(e1) {
e1 && logger.error(e1);
Model.count({}, function(e2, count) {
e2 && logger.error(e2);
logger.info(count);
mongoose.disconnect();
});
});
$node src/main.js
mongo connection opened
10
mongo connection closed
動いたみたい。
そもそもMongoやめようかなみたいな気持ち。