ç§ã¯æ°å¹Žåããmongoose
ã䜿çšããŠããŸãããæè¿ãæ¥ç¶ã倱ãããŠããããã«èŠãããšããåé¡ããããããããŸãã
// Connecting to MongoDB 3.2.1
var connString = "mongodb://xxxxx:xxxxx<strong i="8">@xxxxx</strong>:xxxx,xxxx:xxxx/xxx?ssl=true";
var connOptions = {
"mongos": { "ssl": true, "sslValidate": false }
};
mongoose.connect(connString, connOptions, function(err, db) {
if(err) { console.log("Error connecting to db: "+err); }
});
ãã³ã°ãŒã¹ã¯ãã é»è©±ãããçŽãã®ããããŸãã ãšã©ãŒã¯çºçãããã¡ã¢ãª/ CPUã¯ãµãŒããŒãšããŒã¿ããŒã¹ã§åé¡ãªããä»ã®ãµãŒããŒããæ¥ç¶ã§ããŸãã åèµ·åãããšåžžã«ä¿®æ£ãããŸãã
db.Something.count({}, callback);
mongoose 4.4.11
ãã³ãŒã«ããã¯ãåæ¢ãããšãã®mongoose.connection.readyState === UNAUTHORIZED
ã
ããã§ã mongoose 4.6.0
ã«ã¢ããã°ã¬ãŒãããŸãããã4æé以å
ã«ã³ãŒã«ããã¯ãåã³åæ¢ãã mongoose.connection.readyState === CONNECTED
ã
ãããèµ·ãããªãããã«ããæ¹æ³ã¯ãããŸããïŒ
ãã以äžãããã°æ å ±ãåéã§ããŠããããã§ããååŸããæ å ±ãæããŠãã ããã
ã¹ã¿ã³ãã¢ãã³ãã¬ããªã«ã»ããããŸãã¯ã·ã£ãŒãã¯ã©ã¹ã¿ãŒã«æ¥ç¶ããŠããŸããïŒ ãŸããSSLã䜿çšããŠããããšã確èªã§ããŸããïŒ
ããã¯ç§ã«ãšã£ãŠéå»æ°æ¥éã®å€§ããªåé¡ã§ããã å®è¡äžã®ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã€ãã³ãã«ãŒããã©ãã©ãé ããªããã·ã¹ãã å šäœã®é 延ãå¢å ããŸããã Nodeã¢ããªã±ãŒã·ã§ã³ãåèµ·åãããšãæ¯ååé¡ã解決ããæ°åãŸãã¯æ°æéã®æäœåŸã«åé¡ãåçºããŸããã
ãã³ã°ãŒã¹4.5.10ã«æ»ããšãåé¡ã解決ããŸããã
4.6.0ã®åæ§ã®åé¡ã§ãã¬ããªã«ã»ããã«æ¥ç¶ããŠãããã©ããã¯ããããŸããããSSLã䜿çšããŠããããšã¯ééããããŸããã
FWIWã4.6.0ã¯åžžã«æ¥ç¶ãåæããŠããŸããã 4.5.10ã¯è¯ãã§ãã
@djanowskiæ¥ç¶ã³ãŒããã©ã®ããã«èŠããããã©ã®ããŒãžã§ã³ã®mongodbã䜿çšããŠããããªã©ãããã«æ å ±ãæäŸã§ããŸããïŒ
@ vkarpov15 MongoDB3.2.6ã䜿çšããŠããŸããã
æ¥ç¶ãªãã·ã§ã³ïŒ
auth: {
authMechanism: 'SCRAM-SHA-1',
},
mongos: {
ssl: true,
sslValidate: true,
sslCA: [cert],
},
åäžã®ã¢ã³ãŽãŸãã¯è€æ°ã®ã¢ã³ãŽïŒ
è€æ°ã®ã¢ã³ãŽã ComposeMongoãããã€ã¡ã³ãã䜿çšããŸãã
ããã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãæ¯æŽããããã«ä»ã«ã§ããããšã¯ãããŸããïŒ ããã«ãããæ°ããããŒãžã§ã³ãžã®ç§»è¡ã劚ããããŠããŸã...
ããªãã®ã³ãŒããèŠãã«æ¬åœã®ä»®èª¬ãç«ãŠãã®ã¯é£ããã§ãã mongoose.connect
ã«æ¥ç¶ããŠããå Žåã¯ããã®åé¡ãçºçãå§ãããšãã«mongoose.connection.readyState
ã®å€ã確èªããŸãã ãŸãããã³ã°ãŒã¹ã®ãããã°ã¢ãŒãmongoose.set('debug', true)
æå¹ã«ããŸããããã«ããããã³ã°ãŒã¹ã®æäœããšã«ãããã°ã¡ãã»ãŒãžãã³ã³ãœãŒã«ã«åºåãããŸãã ãããã®ã¡ãã»ãŒãžãå°å·ãããŠãããã©ããã¯ãééããªããããã°ã«åœ¹ç«ã¡ãŸãã
@ vkarpov15ããã¯ç§ãæ¥ç¶ããããã«äœ¿çšããŠããã³ãŒãã§ãïŒ https ïŒ //gist.github.com/sommestad/c0c6a7fa4feaadf84ecbb59cc3432c90
ããã¯ãã©ã€ããŒãã¢ãžã¥ãŒã«ã®äžéšã§ãããããèŠç¹ã§ãã
_ïŒæ¥ç¶ã©ããã³ã°ã¢ãžã¥ãŒã«ã®çç±ã¯ãæ¥ç¶ãä»ã®ãã©ã€ããŒãNPMã¢ãžã¥ãŒã«ã§åå©çšãããããšãããããã§ããããã¯ããããŸã§ãã³ã°ãŒã¹ã§ã¯ããŸãæ©èœããŠããŸããã§ãããïŒ_
ãããã®åé¡ãçºçãããšãã«æ¥ç¶ç¶æ ã®ãã°ãæå¹ã«ããŸããããæ¥ç¶èªäœã¯å€æŽãããŠããªãããã§ãïŒå°ãªããšãã€ãã³ãã¯çºè¡ãããŸããã§ããïŒã ãã®ãããã¯ã©ã€ã¢ã³ããåæãããããã«ã¯èŠããŸããã§ããã
URIã®replicaSet
ãšæ¥ç¶ããŠããŸããïŒã¿ãŒã²ããããŒã¿ããŒã¹ã¯Compose Deploymentã§ãïŒã åè¿°ã®ããã«ãSSLã䜿çšãããŸãã ãŸãããã©ãã£ãã¯ã¯AWSNATã²ãŒããŠã§ã€ãä»ããŠã«ãŒãã£ã³ã°ãããŸãã AWS NATã®ã¢ã€ãã«ã¿ã€ã ã¢ãŠãã¯5åã§ããããããã®åé¡ã¯ãã©ãã£ãã¯ãå€ãå Žåã§ãçºçããŸããã
ç§ã«ãšã£ãŠããã€ãã®åé¡ãããªãã¯ããã解決ããŸãããïŒ
@ youth7ããã¢ã€ãã¢ã¯ãããŸããã ãŸããcomposeãããã€ã¡ã³ãã«æ¥ç¶ããŠããŸããïŒ è¿œå æ å ±ãæäŸããŠãã ãã
ããã®åå ãèŠã€ããããã«ç§ãã§ããããšã¯ä»ã«ãããŸããïŒ èª¿æ»ã§ããçè«ã¯ãããŸããïŒ
@sommestadå ·äœçãªããšã¯äœããããŸããã äœæ²ããã®ãã°ã¯ãããŸããïŒ
mongoose 4.7.2
ãè©ŠããŸãããã48æéåŸã«åãåé¡ãçºçããŸããã ãã®æç¹ã§ãç§ã¯ç¬èªã®åé¡ãæ±ããŠãã4.4.11
æ©ãŸãããŠããŸãã
ãã°ãåéããããšãæåŸ
ããŠãã¢ãµãŒããŒã«4.7.2
ãã€ã³ã¹ããŒã«ããŸããããåé¡ãªã2é±éå®è¡ãããŠããŸãã ãã¶ããããŒã¿/æ¥ç¶ãªã©ã®éãåé¡ãåŒãèµ·ãããŸããïŒ
ãããèµ·ããå§ãããšããããåçŸããããã®ã³ãŒãã¯éåžžã«ç°¡åã§ãã åºæ¬çã«ãã¯ãšãªã®ã³ãŒã«ããã¯ã¯ãã¹ãŠæ¶ããŸãã
db.Something.find({}, callback); //this callback is never fired
ç§ãèšã£ãããã«ããããèµ·ãã£ãŠãããšãã mongoose.connection.readyState === CONNECTED
å€ã ç§ã¯mongodbãã°ãæå³ããŸãã-ãã®ãšã©ãŒãçºçãããšãããmongodbãµãŒããŒãã°ããã³ãã§ããŸããïŒ
ãã®é害ãçºçãããšãã«DBãã°ãã¹ãã£ã³ãããšãããç°åžžãªããšã¯äœãèŠãããŸããã§ããã æ¥ç¶æ°ãåææ°ãæ¥ç¶ã®åé¡ãªã©ã«é¢é£ããåé¡ã¯ãããŸããã§ããã ãŸããé äžåã§äœãèŠããªãã£ãComposeã«ãé£çµ¡ãåããŸããã
@bendytree HTTPè² è·ãã¹ãããŒã«ã䜿çšããŠããã®ãã¢ãµãŒããŒã«ããªã¥ãŒã ãã¹ããŒã§ããŸããïŒ
@bendytreeãŸããããŒãã®ãã¹ãŠã®ãªãªãŒã¹ã©ã€ã³ïŒ4.xã6.xã7.xïŒã§çºçããŸããïŒ
@ vkarpov15ææ°ã®MongoDBãã©ã€ããŒã§ãã¹ãã§ããããã«ã4.7.7ã
@ vkarpov15 66d559b19a86c70e30a8f083d03eb22566571b7eããããšãïŒ ãã£ãŠã¿ãŸãã
ããã§ãåãã§ãããããã§ã¯SSLã¬ããªã«ã§ãæ°å/æéåŸããªã¯ãšã¹ãã¯callbackïŒïŒã§åæ¢ãïŒããã«è©³çŽ°ãªãã°ãè¿œå ããŸããïŒããšã©ãŒã¯çºçããŸããã æšå€4.7.7ã«ã¢ããã°ã¬ãŒãããŸãããããŸã åé¡ããããŸãã
ç·šéïŒ4.7.0ã«ããŠã³ã°ã¬ãŒãããããšããŸããããææªã§ããïŒ5å以å ã«åé¡ãçºçããŸããïŒã 4.5.10ãè©ŠããŠããŸãã
@gierschvããŒã6.9.xïŒ
@djanowskiãããããŸã 4.6 / 4.7.xLTSã§ãã
@djanowskiããŒã4.4.2ã§ã®ã¿è©ŠããŸãã
ãã®åé¡ã®éè€ã®å¯èœæ§ã®ãããªã¹ããä¿æããïŒ
åèãŸã§ã«ã4.5.10ã¯ããã§ã¯ããŸãæ©èœããŠããããã§ãéå»5æéã¯åé¡ãããŸããã ãŸãããã¹ãŠã®ãã·ã³ã§ïŒ4690ã®ãããªé«ãCPU䜿çšçããããŸãããããããããŠã³ã°ã¬ãŒãã«ãã£ãŠä¿®æ£ãããããã§ãã
ããã«æ°ããéçºã¯ãããŸãããïŒ ãã°ãèŠã€ããããã«ç§ãã¡ã«ã§ããããšã¯ä»ã«ãããŸããïŒ
@sommestadææ°ã®ãã³ã°ãŒã¹ã§ãŸã ãã®åé¡ããããŸããïŒ
ååã¯åºæ¬çã«ã·ã¹ãã å šäœãå£ããã®ã§ããŸã ãããŠã¢ããã°ã¬ãŒãããŠããŸããïŒå€æŽã¯ããã°ããããŠããã衚瀺ããããããé·æéå®è¡ããªããšç¢ºèªãå°é£ã§ãïŒã ä¿®æ£ããããšä¿¡ããçç±ãããå Žåã¯ãã·ã¹ãã ã®ããåé¢ãããéšåãè©Šãããšãã§ããŸããïŒ
ç·šéïŒping @varunjayaraman
ç§ã®åŽã§ã¯ãããŒã6.x LTSã«åãæ¿ããŠãæ°é±éåã«æåŸã®ãã³ã°ãŒã¹ããŒãžã§ã³ã«ã¢ããã°ã¬ãŒãããŸãããããã以éã¯åé¡ãããŸããã
çŽ2ãæåã«ããŒã6.10.2ããã³ã°ãŒã¹4.9.9ã«ã¢ããã°ã¬ãŒãããŸããã ãŸã åãåé¡ãçºçããŠããŸãã
æ¥ç¶æååã®åœ¢åŒã¯mongodb://username:[email protected]:1234,db2.com:2345/db-name?ssl=true
ã§ãã
console.log("fetching user...");
userCollection.findOne({_id: userId}, function(err, user){
console.log("done"); // this never happens
...
});
ã³ãŒã«ããã¯ãåæ¢ãããšãåã³éå§ããããšã¯ãããŸããã ããã»ã¹ãåéãããšãæ£åžžã«æ¥ç¶ãããŸãã
ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã«åœ¹ç«ã€ããŒã¿ãåéã§ããå Žåã¯ããã²ãµããŒããããŠããã ããŸãã
åãåé¡ãçºçããŠããã以äžã®ã³ãŒãã§åçŸã§ããŸãïŒé«éãªã¢ãã¯ã¢ãã/ã³ãŒãã¹ã¿ã€ã«ã§ç³ãèš³ãããŸããïŒã
æ¥ç¶ã¿ã€ã ã¢ãŠããã·ãã¥ã¬ãŒãããããã«ãpoolSizeã1ã«äžãã次ã®é åºã§åŒã³åºããã2ã€ã®ãšã³ããã€ã³ãïŒéåžž/äœéïŒãžã®èŠæ±ãããªã¬ãŒããŸãã
以äžã䜿çšããŠè€è£œããŸãã
// Require modules
const mongoose = require('mongoose');
const express = require('express');
const request = require('request');
const parseJson = require('body-parser').json();
// Use native Promises in Mongoose
mongoose.Promise = Promise;
// Create the test schema
const testSchema = new mongoose.Schema({
name: {
type: String,
trim: true,
default: 'test'
}
});
// Create the mongoose model
mongoose.model('Test', testSchema, 'test');
// Create some test data
mongoose.model('Test').create([
{name: 'test1'},
{name: 'test2'},
{name: 'test3'},
{name: 'test4'},
{name: 'test5'}
]);
// Create the Express based app
const app = express();
// Create the express router
const router = express.Router();
// Create a normal route
router.route('/normal').get(parseJson, function (req, res, next) {
mongoose.model('Test').find({}).then(
function (data) {
res.status(200).json(data);
}
).catch(
function (err) {
res.status(400).json(err);
}
);
});
// Create up a slow route
router.route('/slow').get(parseJson, function (req, res, next) {
mongoose.model('Test').find({$where: 'sleep(10000) || true'}).then(
function (data) {
res.status(200).json(data);
}
).catch(
function (err) {
res.status(400).json(err);
}
);
});
// Add middleware to console log every request
var requestNumber = 1;
app.use(function (req, res, next) {
console.log('Request ' + requestNumber, req.method, req.url);
requestNumber++;
next();
});
// Use the router
app.use('/', router);
// Listen for requests
app.listen(4000, function () {
console.log('Server listening on port 4000');
});
// Catch any uncaught exceptions
process.on('uncaughtException', function (err) {
console.log('Uncaught exception', err);
});
// Catch any unhandled rejections
process.on('unhandledRejection', function (reason) {
console.error('Unhandled Rejection', reason);
});
// Database connection options
const connectionOpts = {
// Use the new connection logic
useMongoClient: true,
// Do not auto reconnect (the Node code will auto reconnect)
autoReconnect: false,
// Use a poolsize of 1 to simulate a timeout using multiple request to slow and normal endpoints
poolSize: 1
};
// Connection method with retry
const connectWithRetry = function () {
// Check if we still need to connect
if (mongoose.connection.readyState !== mongoose.Connection.STATES.connected) {
// Connect
return mongoose.connect('mongodb://localhost:27017/test', connectionOpts).catch(
function (err) {
console.log('Can not connect to mongo', err);
}
);
}
};
// Helper function to execute a request to the normal endpoint
const doRequestNormal = function () {
request({
url: 'http://localhost:4000/normal',
json: true,
timeout: 60000
}, function (error, response, body) {
if (error) {
console.log('Error on normal request', error, response);
}
console.log('Performed normal request, body:', body);
});
};
// Helper function to execute a request to the normal endpoint
const doRequestSlow = function () {
request({
url: 'http://localhost:4000/slow',
json: true,
timeout: 60000
}, function (error, response, body) {
if (error) {
console.log('Error on slow request', error, response);
}
console.log('Performed slow request', body);
});
};
// Helper function to simulate requests
const doRequests = function () {
doRequestNormal();
doRequestSlow();
doRequestNormal();
setTimeout(function () {
console.log('Do normal request after 1 minute');
doRequestNormal();
}, 60000);
};
// Connecting event
mongoose.connection.on('connecting', function () {
console.log('Connecting to database...');
});
// Connected event
mongoose.connection.on('connected', function () {
console.log('Database is connected, start requesting...');
doRequests();
});
// Timeout event
mongoose.connection.on('timeout', function (err) {
console.log('Database timeout error', err);
});
// Error event
mongoose.connection.on('error', function (err) {
console.log('Database connection error', err);
});
// Disconnected event
mongoose.connection.on('disconnected', function () {
console.error('Database got disconnected, reconnecting in 5 sec...');
// Reconnect in 5 seconds
setTimeout(connectWithRetry, 5000);
});
// Connect to the database with retry
connectWithRetry();
// Log the connection state every 10 seconds
setInterval(function () {
console.log('Mongoose connection readystate is', mongoose.connection.readyState);
}, 10000);
ã³ã³ãœãŒã«åºåã¯æ¬¡ã®ãšããã§ãã
Connecting to database...
Server listening on port 4000
Database is connected, start requesting...
Request 1 GET /normal
Request 2 GET /slow
Request 3 GET /normal
Performed normal request, body: [ { _id: '597f8c6f41bf2e119594ba1a', __v: 0, name: 'test1' },
{ _id: '597f8c6f41bf2e119594ba1b', __v: 0, name: 'test2' },
{ _id: '597f8c6f41bf2e119594ba1c', __v: 0, name: 'test3' },
{ _id: '597f8c6f41bf2e119594ba1d', __v: 0, name: 'test4' },
{ _id: '597f8c6f41bf2e119594ba1e', __v: 0, name: 'test5' } ]
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Performed slow request { name: 'MongoError',
message: 'connection 0 to localhost:27017 timed out' }
Performed normal request, body: { name: 'MongoError',
message: 'connection 0 to localhost:27017 timed out' }
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Do normal request after 1 minute
Request 4 GET /normal
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Error on normal request { Error: ESOCKETTIMEDOUT
at ClientRequest.<anonymous> (/Users/adriaanmeuris/Documents/Projecten/Mongoose timeout/node_modules/request/request.js:819:19)
at ClientRequest.g (events.js:291:16)
at emitNone (events.js:86:13)
at ClientRequest.emit (events.js:185:7)
at Socket.emitTimeout (_http_client.js:620:10)
at Socket.g (events.js:291:16)
at emitNone (events.js:86:13)
at Socket.emit (events.js:185:7)
at Socket._onTimeout (net.js:339:8)
at ontimeout (timers.js:365:14)
at tryOnTimeout (timers.js:237:5)
at Timer.listOnTimeout (timers.js:207:5) code: 'ESOCKETTIMEDOUT', connect: false } undefined
Performed normal request, body: undefined
Mongoose connection readystate is 1
Mongoose connection readystate is 1
ããŒã¿ããŒã¹ã®readyStateã10ç§ããšã«ç£èŠããŠããŸããããã¯ãæ¥ç¶ããŸã ã¢ã¯ãã£ãã§ããããšã瀺ããŠããŸãã Mongooseãšã©ãŒ/ã¿ã€ã ã¢ãŠãã€ãã³ãã¯ããªã¬ãŒãããããªã¯ãšã¹ã4ã®ã³ãŒã«ããã¯ã¯åŒã³åºãããŸããïŒãªã¯ãšã¹ãããã±ãŒãžã䜿çšããŠ60ç§åŸã«ã¿ã€ã ã¢ãŠãããŸãïŒã httpïŒ// localhost ïŒ4000 / slowããã³æ¬¡ã®httpïŒ// localhost ïŒ4000 / normalã«ã¢ã¯ã»ã¹ããŠãã¹ãããããšãã§ããŸãã
https://team.goodeggs.com/reconnecting-to-mongodb-when-mongoose-connect-fails-at-startup-83ca8496ca02ã«åºã¥ãèªååæ¥ç¶ããžãã¯ã䜿çšããŠããŸãããmongoãåæãããªãããããããããªã¬ãŒãããããšã¯ãããŸããã
ããå Žåã«ã¯ããã¹ãããŒã¿ãäœæããã³ãŒãã«ã³ã¡ã³ããããšåçŸã§ããªãããšããããŸãïŒãããã£ãŠãåºæ¬çã«ç©ºã®ã³ã¬ã¯ã·ã§ã³ãã¯ãšãªããŸãïŒ
èããããé¢é£ããåé¡ïŒ
ã©ããªå©ãã§ã倧æè¿ã§ãã
ããã§ãmongooseã䜿çšããã«node-mongodb-nativeãæäœããããã«ãäžèšã®ã¹ã¯ãªãããæžãçŽããŠããã«æãäžããŸããã çµæã¯ä»ã§ã¯å€§ããç°ãªããŸãã
æ¥ç¶èšå®ãšèŠæ±ã¯åãã§ãã
ã³ãŒãïŒ
// Require modules
const MongoClient = require('mongodb').MongoClient;
const Server = require('mongodb').Server;
const express = require('express');
const request = require('request');
const parseJson = require('body-parser').json();
// The db reference
var db;
// Function to insert test data
function insertTestData() {
return new Promise(function (resolve, reject) {
// Get the test collection
var test = db.collection('test');
// Insert some documents
test.insertMany([
{name: 'test1'},
{name: 'test2'},
{name: 'test3'},
{name: 'test4'},
{name: 'test5'}
], function (err, result) {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
// Create the Express based app
const app = express();
// Create the express router
const router = express.Router();
// Create a normal route
router.route('/normal').get(parseJson, function (req, res, next) {
// Get the documents collection
var collection = db.collection('test');
// Find some documents
collection.find({}).toArray(function (err, data) {
if (err) {
res.status(400).json(err);
} else {
res.status(200).json(data);
}
});
});
// Create up a slow route
router.route('/slow').get(parseJson, function (req, res, next) {
// Get the documents collection
var collection = db.collection('test');
// Find some documents
collection.find({$where: 'sleep(10000) || true'}).toArray(function (err, data) {
if (err) {
res.status(400).json(err);
} else {
res.status(200).json(data);
}
});
});
// Add middleware to console log every request
var requestNumber = 1;
app.use(function (req, res, next) {
console.log('Request ' + requestNumber, req.method, req.url);
requestNumber++;
next();
});
// Use the router
app.use('/', router);
// Listen for requests
app.listen(4000, function () {
console.log('Server listening on port 4000');
});
// Catch any uncaught exceptions
process.on('uncaughtException', function (err) {
console.log('Uncaught exception', err);
});
// Catch any unhandled rejections
process.on('unhandledRejection', function (reason) {
console.error('Unhandled Rejection', reason);
});
// Database connection options
const connectionOpts = {
// Do not auto reconnect (the Node code will auto reconnect)
autoReconnect: false,
// Use a poolsize of 1 to simulate a timeout using multiple request to slow and normal endpoints
poolSize: 1
};
// Connection method with retry
const connectWithRetry = function () {
return MongoClient.connect('mongodb://localhost:27017/test', connectionOpts).then(
function (database) {
db = database;
setupEvents();
console.log('Connected to mongo');
}
).catch(
function (err) {
console.log('Can not connect to mongo', err);
return err;
}
);
};
// Helper function to execute a request to the normal endpoint
const doRequestNormal = function () {
request({
url: 'http://localhost:4000/normal',
json: true,
timeout: 60000
}, function (error, response, body) {
if (error) {
console.log('Error on normal request', error, response);
}
console.log('Performed normal request, body:', body);
});
};
// Helper function to execute a request to the normal endpoint
const doRequestSlow = function () {
request({
url: 'http://localhost:4000/slow',
json: true,
timeout: 60000
}, function (error, response, body) {
if (error) {
console.log('Error on slow request', error, response);
}
console.log('Performed slow request', body);
});
};
// Helper function to simulate requests
const doRequests = function () {
doRequestNormal();
doRequestSlow();
doRequestNormal();
setTimeout(function () {
console.log('Do normal request after 1 minute');
doRequestNormal();
}, 60000);
};
// Helper function to setup mongo events
function setupEvents() {
// Connecting event
db.on('connecting', function () {
console.log('Connecting to database...');
});
// Connected event
db.on('connected', function () {
console.log('Database is connected, start requesting...');
});
// Timeout event
db.on('timeout', function (err) {
console.log('Database timeout error', err);
});
// Error event
db.on('error', function (err) {
console.log('Database connection error', err);
});
// Disconnected event
db.on('close', function () {
console.error('Database got disconnected, reconnecting in 5 sec...');
// Reconnect in 5 seconds
setTimeout(connectWithRetry, 5000);
});
}
// Connect to the database with retry
connectWithRetry().then(
function () {
return insertTestData();
}
).then(
function () {
doRequests();
}
);
ã³ã³ãœãŒã«åºåã¯æ¬¡ã®ãšããã§ãã
Server listening on port 4000
Connected to mongo
Request 1 GET /normal
Request 2 GET /slow
Request 3 GET /normal
Performed normal request, body: [ { _id: '598207c16caf9224cf3b8897', name: 'test1' },
{ _id: '598207c16caf9224cf3b8898', name: 'test2' },
{ _id: '598207c16caf9224cf3b8899', name: 'test3' },
{ _id: '598207c16caf9224cf3b889a', name: 'test4' },
{ _id: '598207c16caf9224cf3b889b', name: 'test5' } ]
Performed slow request [ { _id: '598207c16caf9224cf3b8897', name: 'test1' },
{ _id: '598207c16caf9224cf3b8898', name: 'test2' },
{ _id: '598207c16caf9224cf3b8899', name: 'test3' },
{ _id: '598207c16caf9224cf3b889a', name: 'test4' },
{ _id: '598207c16caf9224cf3b889b', name: 'test5' } ]
Performed normal request, body: [ { _id: '598207c16caf9224cf3b8897', name: 'test1' },
{ _id: '598207c16caf9224cf3b8898', name: 'test2' },
{ _id: '598207c16caf9224cf3b8899', name: 'test3' },
{ _id: '598207c16caf9224cf3b889a', name: 'test4' },
{ _id: '598207c16caf9224cf3b889b', name: 'test5' } ]
Do normal request after 1 minute
Request 4 GET /normal
Performed normal request, body: [ { _id: '598207c16caf9224cf3b8897', name: 'test1' },
{ _id: '598207c16caf9224cf3b8898', name: 'test2' },
{ _id: '598207c16caf9224cf3b8899', name: 'test3' },
{ _id: '598207c16caf9224cf3b889a', name: 'test4' },
{ _id: '598207c16caf9224cf3b889b', name: 'test5' } ]
åã®ã¹ã¯ãªããã®ããã«Mongoãšã©ãŒ/ã¿ã€ã ã¢ãŠãã€ãã³ãã¯ããªã¬ãŒãããŸãããããªã¯ãšã¹ã2ãš3ã¯æ£ãã解決ããããªã¯ãšã¹ã4ã®ã³ãŒã«ããã¯ãããªã¬ãŒãããŸã-Mongooseã䜿çšããŠããã¹ã¯ãªãããšã¯å¯Ÿç §çã§ãã
ç§ã¯ããããã³ã°ãŒã¹ãšã¢ã³ãŽã®åé¡ã§ãããã©ãããé€å€ããããšããŠããŸã-ãããã£ãŠããããã®ã¹ã¯ãªããã®çµæãæ¯èŒããããšã«é¢ããå©ããããã ããã°å¹žãã§ãã ãã¶ã@ vkarpov15ã¯ããã«ãã£ã€ã ã
@adriaanmeurisã¯å¥åŠã§ããããããæåã®ã¹ã¯ãªããã®å®è¡ããåŸãããåºåã§ãã
$ node gh-4513.js
Connecting to database...
Server listening on port 4000
Database is connected, start requesting...
Request 1 GET /normal
Request 2 GET /slow
Request 3 GET /normal
Performed normal request, body: [ { _id: '5998e4a79bb81d37ac4b1a26', __v: 0, name: 'test1' },
{ _id: '5998e4a79bb81d37ac4b1a27', __v: 0, name: 'test2' },
{ _id: '5998e4a79bb81d37ac4b1a28', __v: 0, name: 'test3' },
{ _id: '5998e4a79bb81d37ac4b1a29', __v: 0, name: 'test4' },
{ _id: '5998e4a79bb81d37ac4b1a2a', __v: 0, name: 'test5' } ]
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Performed slow request [ { _id: '5998e4a79bb81d37ac4b1a26', __v: 0, name: 'test1' },
{ _id: '5998e4a79bb81d37ac4b1a27', __v: 0, name: 'test2' },
{ _id: '5998e4a79bb81d37ac4b1a28', __v: 0, name: 'test3' },
{ _id: '5998e4a79bb81d37ac4b1a29', __v: 0, name: 'test4' },
{ _id: '5998e4a79bb81d37ac4b1a2a', __v: 0, name: 'test5' } ]
Performed normal request, body: [ { _id: '5998e4a79bb81d37ac4b1a26', __v: 0, name: 'test1' },
{ _id: '5998e4a79bb81d37ac4b1a27', __v: 0, name: 'test2' },
{ _id: '5998e4a79bb81d37ac4b1a28', __v: 0, name: 'test3' },
{ _id: '5998e4a79bb81d37ac4b1a29', __v: 0, name: 'test4' },
{ _id: '5998e4a79bb81d37ac4b1a2a', __v: 0, name: 'test5' } ]
Mongoose connection readystate is 1
Do normal request after 1 minute
Request 4 GET /normal
Performed normal request, body: [ { _id: '5998e4a79bb81d37ac4b1a26', __v: 0, name: 'test1' },
{ _id: '5998e4a79bb81d37ac4b1a27', __v: 0, name: 'test2' },
{ _id: '5998e4a79bb81d37ac4b1a28', __v: 0, name: 'test3' },
{ _id: '5998e4a79bb81d37ac4b1a29', __v: 0, name: 'test4' },
{ _id: '5998e4a79bb81d37ac4b1a2a', __v: 0, name: 'test5' } ]
Mongoose connection readystate is 1
Mongoose connection readystate is 1
^C
$
ãã³ã°ãŒã¹ã¯æ¥ç¶ãç¶æããŸãã mongodbãnodeãmongooseã®ããŒãžã§ã³ãæ確ã«ã§ããŸããïŒ
ãã¹ãããŠãããŠããããšãïŒ å®éãMongooseã¯åžžã«æ¥ç¶ããããŸãŸã§ãããã³ãŒã«ããã¯ã¯çºçããªããªããŸãïŒExpressã«ãªã¯ãšã¹ããå±ãã®ã確èªã§ããŸãããã¿ã€ã ã¢ãŠãããŸãïŒ
ç§ã¯ãã¹ãããŠããŸããïŒ
æŽæ°ããŸããïŒ
æåã«æçš¿ããã¹ã¯ãªããã䜿çšããŠãåé¡ãããŒã«ã«ã§åçŸã§ããŸãã ããã¯ãMongoæ¥ç¶ãã¿ã€ã ã¢ãŠããããšãã«ã®ã¿çºçããããããããã·ãã¥ã¬ãŒãããã¯ãšãªãå€æŽããããšããå§ãããŸãã
mongoose.model('Test').find({$where: 'sleep(10000) || true'})
ïŒããã«ãããã¹ãŠã®ãã·ã³ã§ã¿ã€ã ã¢ãŠããããªã¬ãŒããããã©ããã¯ããããŸããããã®ãããåçŸããã«ã¯ãã®ã¯ãšãªãå€æŽããå¿ èŠãããå ŽåããããŸãïŒ
ãã³ã°ãŒã¹4.10.4ã«ã¢ããããŒãããåŸããããã®åé¡ã¯çºçããªããªããŸããã
ä»ã®äººãåé¡ãçµéšããŠããããã«èŠããã®ã§ãå°ãå¥åŠã«æããŸãããåé¡ãåçºããå
åããªããæ°é±éã«ããã£ãŠå€ãã®ãµãŒãã¹ãå®è¡ãããŠããŸãã ð€
ãã ãã以åã¯@adriaanmeurisãšåãæ¹æ³ã§åé¡ãçºçãããããã¿ã€ã ã¢ãŠããçºçããŠããªãå¯èœæ§ããããŸãã
ããŒã8ãå®è¡ããŠããŸãã
ãã®åé¡ã¯ãŸã å®æçã«çºçããŠããŸãã
@adriaanmeurisã®ã¹ã¯ãªããã§ã¯åçŸã§ããŸããã§ããããæ¯ååçŸããä¿®æ£ããŒãžã§ã³ã次ã«ç€ºããŸãã
@bendytreeã«æè¬ããŸããããªãã®ã¹ã¯ãªããã§ç§ãåçŸã§ããŸãïŒ
7) Database connecting...
49) Database connected...
49) Dropping...
57) Creating...
156) FastQuery-A: starting...
166) FastQuery-A: success: 1
1158) SlowQuery: starting...
2158) FastQuery-B: starting...
362165) SlowQuery: failed: MongoError: connection 0 to localhost:27017 timed out
362167) FastQuery-B: failed: MongoError: connection 0 to localhost:27017 timed out
605159) FastQuery-C: starting...
1210149) Giving Up...
ããã¯åºæ¬çã«ç§ã®ã¹ã¯ãªãããšåãã§ãããã¿ã€ã ã¢ãŠãæéãé·ããªããŸãã 誰ããç§ã®ã¹ã¯ãªããïŒ10ç§ã®ã¹ãªãŒãã䜿çšïŒã§åçŸã§ããããã§ã¯ãªããããããŒã«ã«ã§ã¿ã€ã ã¢ãŠããã·ãã¥ã¬ãŒãããã®ã«ãããæéã¯ãã»ããã¢ããã«å¿ããŠå¢æžãããšæããŸãã
@ vkarpov15ãã®æŽæ°ãããã¹ã¯ãªãããè©Šãããšãã§ããŸããïŒ ãã³ã°ãŒã¹4.8.11ã§ãã¹ãããŠåçŸããŸããã
@bendytreeã§ãªããšãsocketTimeoutMS
ãäœãããå Žåã§ãã NS
362591) SlowQuery: failed: MongoError: connection 0 to localhost:27017 timed out
362591) FastQuery-B: failed: MongoError: connection 0 to localhost:27017 timed out
ã¡ãã»ãŒãžã¯ãmongodbãã©ã€ããŒã®ãœã±ãããã¿ã€ã ã¢ãŠãããããšã瀺ããŠããŸãã mongodbãã©ã€ããŒã¯ããã©ã«ãã§30ç§åŸã«ã¿ã€ã ã¢ãŠãããŸãããOSã«ã泚æãå¿
èŠãªãœã±ããã¿ã€ã ã¢ãŠããããããã15ç§ä»¥äžãããã¯ãšãªã¯é¿ããããšããå§ãããŸãã ãã ãã socketTimeoutMS
ãªãã·ã§ã³ã䜿çšããŠãmongodbã®ãœã±ããã¿ã€ã ã¢ãŠããæ§æã§ããŸãã
mongoose.connect(DB_URL, {
useMongoClient: true,
autoReconnect: false,
poolSize: 1,
socketTimeoutMS: 0
}).catch((err)=>{ log('Connect failed', err); });
ãã®ãªãã·ã§ã³ã0ã«èšå®ãããšãã¹ã¯ãªããã¯ç§ã®ãã·ã³ã§ã»ãŒæåãã10åéã®ã¯ãšãªã¯ãŸã çµäºããŸãããã³ãŒã«ããã¯ã¯ç¶è¡ãããŸã
$ node gh-4513.js
9) Database connecting...
43) Database connected...
43) Dropping...
53) Creating...
177) FastQuery-A: starting...
189) FastQuery-A: success: 1
1174) SlowQuery: starting...
2174) FastQuery-B: starting...
601181) SlowQuery: failed: MongoError: Interrupted by the host
601182) FastQuery-B: success: 1
605173) FastQuery-C: starting...
605174) FastQuery-C: success: 1
ããããåŸç¶ã®ã¯ãšãªã¯æåããŸãã
ãããã«ããããã®å Žåããã³ã°ãŒã¹ã¯ã¿ã€ã ã¢ãŠãã€ãã³ããçºè¡ããã¯ããªã®ã§ããã®åé¡ãä¿®æ£ããŸãã
connectTimeoutMSïŒããã©ã«ãã¯30000msïŒãšsocketTimeoutMSïŒããã©ã«ãã¯360000msïŒãæ··åããŠãããšæããŸãã
socketTimeoutMSãããã©ã€ããŒãä»ããŠå®è¡ãããæãé ãæäœã®é·ãã®2ã3åã«èšå®ããããšããå§ãããŸããsocketTimeoutMSã0ã«èšå®ãããšãå®éã«ã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ããã©ã«ãã®ãœã±ããã¿ã€ã ã¢ãŠãå€ãé©çšãããŸãïŒè©³çŽ°ã«ã€ããŠã¯ãhttpïŒ//mongodb.github.io/ãåç §ããŠãã ããïŒã node-mongodb-native / 2.2 / reference / faq /ïŒã
ãããã£ãŠããã®è³ªåã¯æ®ããŸãããã®å¶éïŒåºå®ãŸãã¯ããã©ã«ãã®OSã¿ã€ã ã¢ãŠãïŒã«éãããšãã«ããªããããã®ã³ãŒã«ããã¯ãçºçããªããªãã®ã§ããïŒ
vkarpov15 @ [email protected] ãç§ã¯ä»ããã®ããã®ãããã§ã¿ã€ã ã¢ãŠãã€ãã³ããåç §ããŠãã ããã ãã ãããã®ã³ãŒã«ããã¯ã®åé¡ã¯åŒãç¶ãçºçããŸãïŒ @bendytreeã®å ã®ã¹ã¯ãªããã䜿çšãããšããã¹ããé«éåããããã«ãLONG_QUERY_DURATION_IN_MSã2000ã«ãsocketTimeoutMSã1000ã«èšå®ã§ããŸãïŒ
ç§ã¯ããã«ããã€ãã®ãã¹ããè¡ããããããã³ã°ãŒã¹ãªãã§ãåçŸã§ããããšãçºèŠããŸããã http://mongodb.github.io/node-mongodb-native/2.2/reference/faq/ãèªãã§ãããšã Closing the socket forces a reconnect of the driverâs connection pool and introduces latency to any other operations which are queued up
ã§ããããšãããããŸããã
mongoose.connection.readyState
ã¯åžžã«1ã§ããã autoReconnect
ãtrue
ã«èšå®ããŠã¿ãŸããããã¹ã¯ãªãããåå®è¡ããŸããã
8) Database connecting...
47) Database connected...
48) Dropping...
73) Creating...
123) FastQuery-A: starting...
129) FastQuery-A: success: 1
1122) SlowQuery: starting...
2126) FastQuery-B: starting...
3130) Database timeout...
3133) SlowQuery: failed: MongoError: connection 0 to localhost:27017 timed out
3133) FastQuery-B: failed: MongoError: connection 0 to localhost:27017 timed out
6063) Database timeout...
7122) FastQuery-C: starting...
7125) FastQuery-C: success: 1
8129) Database timeout...
11070) Database timeout...
13073) Database timeout...
ãããã£ãŠãã³ãŒã«ããã¯ã¯autoReconnectãtrueã«èšå®ããŠæ©èœããŠããããã§ãð
ãã®èšäºãããã«èªãã ãšãïŒ http ïŒ
ã ããç§ã¯autoReconnect
ãfalse
autoReconnect
æ»ããŠã¿ãŸãã+ bufferMaxEntries
ã0
ãããã¯åºåã§ãïŒ
8) Database connecting...
51) Database connected...
51) Dropping...
58) Creating...
112) FastQuery-A: starting...
116) FastQuery-A: success: 1
1115) SlowQuery: starting...
2115) FastQuery-B: starting...
3123) Database timeout...
3123) SlowQuery: failed: MongoError: connection 0 to localhost:27017 timed out
3123) FastQuery-B: failed: MongoError: connection 0 to localhost:27017 timed out
7115) FastQuery-C: starting...
7117) FastQuery-C: failed: MongoError: no connection available for operation and number of stored operation > 0
ããã¯ã @ bendytreeã®ã¹ã¯ãªããã®æåã®ããŒãžã§ã³ã§ã³ãŒã«ããã¯ãããªã¬ãŒãããªãã£ãçç±ã説æããŠããŸãã
@ vkarpov15ããã§ã2ã€ã®è³ªåã
æŽæ°ãããã¹ã¯ãªããã¯æ¬¡ã®ãšããã§ãïŒ
const LONG_QUERY_DURATION_IN_MS = 2000;
const DB_URL = 'mongodb://localhost:27017/test_mongoose_callbacks';
const mongoose = require('mongoose');
mongoose.Promise = Promise;
var startTime = new Date().getTime();
var log = (msg) => {
var seconds = Math.round(new Date().getTime() - startTime);
console.log(seconds+") "+msg);
};
var Model = mongoose.model('Test', new mongoose.Schema({
name: { type: String, trim: true, default: 'test' }
}), 'test');
mongoose.connection.on('connecting', () => { log('Database connecting...'); });
mongoose.connection.on('timeout', () => { log('Database timeout...'); });
mongoose.connection.on('error', () => { log('Database error...'); });
mongoose.connection.on('disconnected', () => { log('Database disconnected...'); });
const doRequest = function (title, slow) {
var logRequest = (msg) => { log(title+": "+msg); };
logRequest("starting...");
var filter = slow ? {$where: 'sleep('+LONG_QUERY_DURATION_IN_MS+') || true'} : {};
Model.count(filter).exec((err, count) => {
logRequest(err ? "failed: "+err : "success: "+count);
});
};
mongoose.connection.on('connected', () => {
log("Database connected...");
log("Dropping...");
mongoose.connection.db.dropDatabase(function(){
log("Creating...");
Model.create([ {name: 'test1'} ], function(){
setTimeout(() => { doRequest("FastQuery-A", false); }, 0);
setTimeout(() => { doRequest("SlowQuery", true); }, 1000);
setTimeout(() => { doRequest("FastQuery-B", false); }, 2000);
setTimeout(() => { doRequest("FastQuery-C", false); }, LONG_QUERY_DURATION_IN_MS+5000);
setTimeout(() => { log("Giving Up..."); }, LONG_QUERY_DURATION_IN_MS+30000);
});
});
});
mongoose.connect(DB_URL, {
useMongoClient: true,
autoReconnect: true,
//bufferMaxEntries: 0, // Uncomment to disable buffering operations
poolSize: 1,
socketTimeoutMS: 1000
}).catch((err)=>{ log('Connect failed', err); });
setInterval(()=>{
if (mongoose.connection.readyState === 1) return;
log('Mongoose.readystate = ', mongoose.connection.readyState);
}, 1000);
ãããããªãã¯æ£ããã§ããç§ãã¡ã¯ããã«ã€ããŠãã£ãšè¯ãããå¿
èŠããããŸãã timeout
ã€ãã³ãã¯å¿
èŠã§ããããã®ã±ãŒã¹ãåŠçããã«ã¯å®éã«ã¯ååã§ã¯ãããŸããã
'disconnected'ãçºè¡ãããªãçç±ã¯ã 'timeout'ã¯ãããŒã«å šäœã§ã¯ãªãã1ã€ã®ãœã±ãããã¿ã€ã ã¢ãŠãããããšãæå³ããããã§ãã ãã³ã°ãŒã¹ã¯ãã¿ã€ã ã¢ãŠãã€ãã³ããçºçãããšãã«ãããŒã«å ã®ãŸã çããŠãããœã±ããã®æ°ãç¥ãå¿ èŠããããŸãããã®æ¹æ³ãç解ããã«ã¯ãããã«èª¿æ»ããå¿ èŠããããŸãã
ã¿ã€ã ã¢ãŠãã€ãã³ããåéä¿¡ãç¶ããçç±ãããã«èª¿æ»ããŸãã ãåŸ ã¡ããã ãããããšãããããŸãïŒ+1ïŒ
ç§ã¯ãããmongodbãã©ã€ããŒã®ããã€ãã®ãã°ãŸã§è¿œè·¡ããŸããïŒ https ïŒ
ç§èªèº«ã®ãã¹ãã§@ vkarpov15ã¯ã mongoose.connection.readyState
ãå€æŽãããããšã¯ãããŸããã ããã¯åãåé¡ã§ããïŒ
@ r3wtãã®åé¡ã¯
@ vkarpov15æçš¿æã«
@ vkarpov15ç§ã¯ãã³ã°ãŒã¹ãã©ã°ã€ã³ãéçºããŠããŸãã ãã©ã°ã€ã³ã¯æ¥ç¶ã®æºåãã§ãããŸã§ãããã¯ããå¿ èŠããããŸããããããªããšãæ¥ç¶ã®åŸ æ©äžã«ãããããã¯ãçºçããŸãïŒçç±ã«ããïŒã æ¥ç¶ã®æºåãæŽãã®ãåŸ ã€ããã«äœ¿çšããŠããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
function ready(){
console.log('ready()');
return new Promise((resolve,reject)=>{
var _int = setInterval(()=>{
if(mongoose.connection.readyState == 1 || forceReady){
clearInterval(_int);
console.log('mongoose connected ready().resolve()')
resolve();
}
},200);
})
}
ç§ãmongoose.connnection.on('connected')
èããŠã¿ãŸããããæ®å¿µãªããããŸããããŸããã§ããã ãã©ã³ã¯ã€ã³ã¹ããŒã«ã§ã¯ãæ£åžžã«æ©èœããŸããã ããããä»ã®ãã³ã°ãŒã¹ãã©ã°ã€ã³ãã€ãã³ãããªãã¹ã³ããŠãããã®ãšçµã¿åãããŠãåé¡ãçºçããå Žæã§ãã connection.readyStateã¯æ°žä¹
ã«0ã®ãŸãŸã§ãããæ¥ç¶ãããã€ãã³ããçºè¡ãããããšã¯ãããŸããã
ç§ã®æèŠã§ã¯require('mongoose') !== require('mongoose')
ã§ãã ãããçã«ããªã£ãŠããããšãé¡ã£ãŠããŸãã
NSïŒ
require('mongoose')
require('mongoose')
require('mongoose')
ãŠãŒã¶ãŒã¹ã¯ãªãããšãã©ã°ã€ã³ã¯ãæ¥ç¶ã«é¢ããæ å ±ãåãåããŸãã ãããããã©ã°ã€ã³bã¯æ±ºããŠããããŸããã ããã¯æå³ããããŸããïŒ
@ r3wt確ãã«ãããã¯ééããªããã£ããããŸãã ãã以æ¥ãmongodbãµãŒããŒãå®éã«åæ¢/èµ·åããmongooseãå°æ¥ãããçºçããã®ãé²ãããã«è¡ããšäž»åŒµãããã¹ããè¿œå ããŸããã ãè¿·æããããããŠç³ãèš³ããããŸããã
æ¥ç¶ã®æºåãã§ãããŸã§ãããã¯ããå Žåã¯ã mongoose.connection.on('connected')
ãæ©èœããã¯ãã§ãã ä»ã«ã©ã®ãã©ã°ã€ã³ã䜿çšããŠããŸããïŒ npm list | grep "mongoose"
å®è¡ããŠã¿ãŠãã ããã require('mongoose') !== require('mongoose')
ãšããããªãã®äž»åŒµã¯ãã©ããã«è€æ°ã®ããŒãžã§ã³ã®ãã³ã°ãŒã¹ããããšç§ã«æãããŸãã
æ®å¿µãªãããmongodbãã©ã€ããŒã®ãªãªãŒã¹ãä¿çãããŠããããããããããäžåºŠããã·ã¥ããå¿ èŠããããŸãã ç³ãèš³ãããŸããããä»ãã°ãããåŸ ã¡ããã ããŸããããé¡ãããããŸãïŒ+1ïŒðŽ
@ vkarpov15ãã®ä¿®æ£ã«ãååããã ãããããšã
@bendytreeã¯ããã®åé¡ãåçŸããããã®èŠªåãªèšèãšå¿èã«æè¬ããŸãã mongodbãã©ã€ããŒããŒã ã¯ãmongodb 3.6ã®ãªãªãŒã¹ã«éã«åãããã«3.0ã®ãªãªãŒã¹ã«åãçµãã§ããããããã®ä¿®æ£ã§2.xã®ãªãªãŒã¹ããŸã åºãããšãã§ããŸããã§ãããããäžåºŠãpingãå®è¡ããŸãã ããããŒããªããŒïŒ
æãåèã«ãªãã³ã¡ã³ã
æ®å¿µãªãããmongodbãã©ã€ããŒã®ãªãªãŒã¹ãä¿çãããŠããããããããããäžåºŠããã·ã¥ããå¿ èŠããããŸãã ç³ãèš³ãããŸããããä»ãã°ãããåŸ ã¡ããã ããŸããããé¡ãããããŸãïŒ+1ïŒðŽ