MongoDBã䜿ããªãã§ãã ããïŒããã䜿ã£ãŠãããã§ã
ãã€ãŠéçºã³ãã¥ããã£ã§ã¯ãMongoDBã䜿ããªãã§ãã ããããšããèšèãæµè¡ããŸãããã¹ããŒãããªããšããçç±ã§ããã©ã³ã¶ã¯ã·ã§ã³ã®ãµããŒããäžè¶³ããŠãããšããçç±ã§ãå€ãã®éçºè ãMongoDBãé¿ããŠããã®ã§ããããã2024幎çŸåšãããããåèŠã®å€ãã¯éå»ã®è©±ãšãªã£ãŠããŸãã
MongoDBã¯ç¶ç¶çãªé²åãéããŠãšã³ã¿ãŒãã©ã€ãºçŽããŒã¿ããŒã¹ã«æé·ããStripeã®ããã«å¹Žé1å ãã«ã®æ±ºæžãåŠçããäŒæ¥ã§ãã³ã¢ã€ã³ãã©ãšããŠæ¡çšãããŠããŸããæ¬æçš¿ã§ã¯ MongoDB ããªãåªããéžæè¢ãªã®ãããããŠå®éã®å€§èŠæš¡ãµãŒãã¹ã§ã©ã®ããã«æŽ»çšãããŠããããèŠãŠãããŸãããã
ãMongoDBã䜿ããªãã§ãã ããããä»ã¯éããŸã
éå»ã«MongoDBã«å¯Ÿããæ¹å€ã¯ãã»ãšãã©ãåæããŒãžã§ã³ã®éçããããŠããŸãããã¹ããŒãæ€èšŒã®æ¬ åŠãACIDãã©ã³ã¶ã¯ã·ã§ã³é察å¿ãããŒã¿ã®æŽåæ§åé¡ãªã©ãäž»ãªè«ç¹ã§ããããããçŸåšãMongoDBã¯ãããã®åé¡ã®å€ããè§£æ¶ããŠããŸãã
ã¹ããŒãæ€èšŒã®ãµããŒãïŒMongoDBã¯ä»ã§ã¯ã¹ããŒãæ€èšŒæ©èœãæäŸããŠããŸããJSONã¹ããŒããéããŠããŒã¿æ§é ã匷å¶ã§ããå¿ èŠã«å¿ããŠRDBMSã«äŒŒãå¶çŽæ¡ä»¶ãèšå®ã§ããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ã®ãµããŒãïŒ4.2ããŒãžã§ã³ããå®å šãªACIDãã©ã³ã¶ã¯ã·ã§ã³ããµããŒãããŠããŸãããã¡ããå€§èŠæš¡ãã©ã³ã¶ã¯ã·ã§ã³ã§ã¯ããã©ãŒãã³ã¹äœäžãèµ·ããå¯èœæ§ããããŸãããããã¯ä»ã®ããŒã¿ããŒã¹ã§ãåæ§ã§ãã
é«å¯çšæ§ãšæŽåæ§ïŒRaftã¢ã«ãŽãªãºã ã«åºã¥ãèªåé害埩æ§ã«ãããããã1ç§ä»¥å ã«åŸ©æ§ãå¯èœã§ãããread/write concernèšå®ãéããŠããŒã¿æŽåæ§ãšãã©ãã£ãã¯åæ£ãå¹ççã«ç®¡çã§ããŸãã
ãã¯ã MongoDB ã¯ããããã¿ã€ããçŽ æ©ãäœããšãã ã䜿ãããŒã¿ããŒã¹ãã§ã¯ãããŸããããšã³ã¿ãŒãã©ã€ãºç°å¢ã§ãååã«å®å®ãã€æ¡åŒµå¯èœãªãœãªã¥ãŒã·ã§ã³ã«ãªã£ãŠããŸãã
How Stripeâs document databases supported 99.999% uptime with zeroâdowntime data migrations
TLA+ ã«ãã£ãŠæ€èšŒããã MongoDB
TLA+(Temporal Logic of Actions Plus) ã¯ã忣ã·ã¹ãã ã®ã¢ã«ãŽãªãºã ãæ°åŠçã«ä»æ§åã»æ€èšŒããããã®èšèªã§ããç°¡åã«èšãã°ãè€éãªã·ã¹ãã ãæå³ã©ããã«åäœããããäºåã«æ€èšŒã§ããããŒã«ã§ããã
MongoDB ã¯ãã® TLA+ ãçšããŠåæ£ã¢ã«ãŽãªãºã ãèšèšããã·ã¹ãã ã®æ£ç¢ºæ§ãä¿èšŒããŠããŸããäŸãã°ãè€æ°ããŒãéã®ããŒã¿è€è£œãæ£ããè¡ãããããé害æã«ããŒã¿æŽåæ§ãç¶æããããããšãã£ãããšãTLA+ã§ã¢ããªã³ã°ã»æ€èšŒããŠããŸãã
ãã㯠MongoDB ããã ãçŽ æ©ãäœããããNoSQLããŒã¿ããŒã¹ã§ã¯ãªããæ°åŠç蚌æãéããŠå®å®æ§ãä¿èšŒãããšã³ã¿ãŒãã©ã€ãºçŽã·ã¹ãã ã§ããããšã瀺ããŸããTLA+ ã«ããæ€èšŒã¯ãMongoDB ã®åæ£ã·ã¹ãã ã¢ã«ãŽãªãºã ãçè«çã«ä¿¡é Œã§ããããšã瀺ããŠããŸãã
Conformance Checking at MongoDB: Testing That Our Code Matches Our TLA+ Specs
MongoDB ã®ã³ã¢æ©èœãã¡
ããã¥ã¡ã³ãå¿åæ§é
MongoDB ã¯ããŒã¿ã JSON ããã¥ã¡ã³ã圢åŒã§ä¿åããŸããããã¯å éšçã«ã¯ BSONïŒBinary JSONïŒã«å€æãããŠåŠçãããŸããããããæ§é ã¯ã¢ãã³ãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãšå®å šã«ãããããŠããŸãã
// MongoDB ããã¥ã¡ã³ãã®äŸ
{
"_id": ObjectId("507f1f77bcf86cd799439011"),
"name": "ê¹ê°ë°",
"email": "kim@example.com",
"skills": ["JavaScript", "React", "Node.js"],
"projects": [{ "name": "ìŒí몰 íë¡ì íž", "status": "ìë£", "technologies": ["React", "MongoDB"]}
]
}
ããããå ¥ãåã«ãªã£ãæ§é ã RDBMS ã§è¡šçŸããããšãããšãè€æ°ã®ããŒãã«ãšè€é㪠JOIN ãå¿ èŠã«ãªããŸãããMongoDB ã§ã¯äžã€ã®ããã¥ã¡ã³ãã§ç°¡æœã«åŠçã§ããŸãã
æè»ãªã¹ããŒã
ã¹ããŒããæè»ã§ãããšããããšã¯ãã¹ããŒããç¡ãããšããæå³ã§ã¯ãããŸãããå¿ èŠã«å¿ããŠã¹ããŒãã匷å¶ããããšãã§ããããç·©ã管çããããšãã§ãããšããæå³ã§ããäŸãã°ããŠãŒã¶ãŒãããã£ãŒã«ããŒã¿ã§äžéšã®ãŠãŒã¶ãŒã¯é»è©±çªå·ãæã£ãŠããŠããããŠãŒã¶ãŒã¯æã£ãŠããªãããšããããŸããRDBMS ã§ã¯ NULL ãèš±å¯ãããå¥ããŒãã«ãäœãå¿ èŠããããŸãããMongoDB ã§ã¯èªç¶ã«åŠçãããŸãã
æ¡åŒµæ§ïŒã·ã£ãŒãã£ã³ã°ïŒ
MongoDB ã®ã·ã£ãŒãã£ã³ã°ã¯éåžžã«åŒ·åãªæ©èœã§ããããŒã¿ãè€æ°ã®ãµãŒããŒã«èªåçã«åæ£ããæ°Žå¹³ã¹ã±ãŒãªã³ã°ãå¯èœã«ããŸããã·ã£ãŒãã¯ã©ã¹ã¿ãŒã¯ä»¥äžã®æ§æèŠçŽ ã§æ§æãããŠããŸãïŒ
- mongosïŒã¯ãšãªãé©åãªã·ã£ãŒãã«ã«ãŒãã£ã³ã°
- config serversïŒã¡ã¿ããŒã¿ã管ç
- shard nodesïŒå®éã®ããŒã¿ä¿å
ã·ã£ãŒãããŒãéããŠããŒã¿ã忣ãããããšã§ãå¹ççãªã¯ãšãªåŠçãšæ¡åŒµãå¯èœã§ããã§ãããã·ã£ãŒãããŒã®éžã³æ¹ã誀ããšæ§èœäœäžãããŒã¿äžåè¡¡ãæããããæ éã«èšèšããå¿ èŠããããŸãã
倿§ãªã€ã³ããã¯ã¹æ©èœ
MongoDB 㯠BâTree ããŒã¹ã®åäžãã£ãŒã«ãã€ã³ããã¯ã¹ãããè€åããŒããã«ãããŒãå°ç空éãããã·ã¥ãããã¹ãã€ã³ããã¯ã¹ãŸã§å€æ§ãªã€ã³ããã¯ã¹ããµããŒãããŸããç¹ã«å°ç空éã€ã³ããã¯ã¹ã¯ S2Geometry ã©ã€ãã©ãªã䜿ã£ãŠäœçœ®æ å ±ããŒã¿ãå¹ççã«åŠçã§ããŸãã
// å°ç空éã€ã³ããã¯ã¹äœæã®äŸ
db.places.createIndex({ "location": "2dsphere" })
// ååŸ1km以å
æ€çŽ¢
db.places.find({
location: {$near: { $geometry: { type: "Point", coordinates: [127.0276, 37.4979] }, $maxDistance: 1000}
}
})
Stripe ã MongoDB ãç©æ¥µçã«äœ¿çšããŠããŸã
Stripe ã®äºäŸã¯ MongoDB ããšã³ã¿ãŒãã©ã€ãºç°å¢ã§ã©ãã»ã©åŒ·åãã瀺ãå®ç§ãªäŸã§ãã2023幎ãStripe ã¯å¹Žé1å ãã«ã®æ±ºæžãåŠçããªããã99.999%ã®çšŒåçãç¶æããŸããã
How Stripeâs document databases supported 99.999% uptime with zeroâdowntime data migrations
DocDBïŒMongoDB ããŒã¹ã®ã«ã¹ã¿ã ãœãªã¥ãŒã·ã§ã³
Stripe 㯠MongoDB Community ãåºç€ãšã㊠DocDB ãšããç¬èªããŒã¿ããŒã¹ã€ã³ãã©ãæ§ç¯ããŸãããDocDB ã¯äžç§éã«500äžä»¶ä»¥äžã®ã¯ãšãªãåŠçããStripe ã®ãã¹ãŠã®è£œåã¢ããªã±ãŒã·ã§ã³ãæ¯ããŠããŸãã
Stripe ã MongoDB ãéžæããçç±ã¯æ¬¡ã®éãã§ãïŒ
- ããã¥ã¡ã³ãã¢ãã«ã®æè»æ§ïŒè€éãªæ±ºæžããŒã¿æ§é ãèªç¶ã«è¡šçŸ
- å€§èŠæš¡ãªã¢ã«ã¿ã€ã ããŒã¿åŠçèœåïŒäžç§éãããæ°çŸäžä»¶ã®ãã©ã³ã¶ã¯ã·ã§ã³åŠç
- éçºè ã®çç£æ§åäžïŒRDBMS ã«æ¯ã¹ãŠé«éãªéçºé床
ç¡åæ¢ããŒã¿ãã€ã°ã¬ãŒã·ã§ã³
Stripe ã®æãå°è±¡çãªå®çžŸã®ã²ãšã€ãç¡åæ¢ããŒã¿ãã€ã°ã¬ãŒã·ã§ã³ã§ããData Movement Platform ãéããŠãµãŒãã¹åæ¢ãªãã§ããŒã¿ãç§»è¡ã§ããŸãããã®ã·ã¹ãã ã¯æ¬¡ã®ãããªã¹ãããã§åäœããŸãïŒ
- ãã€ã°ã¬ãŒã·ã§ã³ç»é²ïŒãã£ã³ã¯ã¡ã¿ããŒã¿ãµãŒãã¹ãžã®ãã€ã°ã¬ãŒã·ã§ã³æå³ç»é²
- 倧éããŒã¿ã®åã蟌ã¿ïŒã¹ãããã·ã§ãããçšããæé©åãããããŒã¿èªã¿èŸŒã¿ïŒ10åæ§èœåäžïŒ
- éåæè€è£œïŒKafka ãš Amazon S3 ãæŽ»çšãããªã¢ã«ã¿ã€ã åæ
- æ£ç¢ºæ§ãã§ãã¯ïŒããŒã¿ã®å®å šæ§ãšæ£ç¢ºæ§æ€èšŒ
- ãã©ãã£ãã¯åãæ¿ãïŒ2ç§ä»¥å ã«å®äºããç¡åæ¢åãæ¿ã
ãã®ãããªã·ã¹ãã ãéããŠãStripe ã¯ãã©ãã£ãã¯æ¥å¢æã«ã·ã£ãŒããåå²ãããã©ãã£ãã¯ãå°ãªãæã«æ°åã®ããŒã¿ããŒã¹ãçµ±åã§ããŸãã
ãããã·ãµãŒããéããä¿¡é Œæ§ã®ç¢ºä¿
Stripe 㯠Go èšèªã§éçºããç¬èªã®ããŒã¿ããŒã¹ãããã·ãµãŒããéããŠãä¿¡é Œæ§ãæ¡åŒµæ§ãã¢ã¯ã»ã¹å¶åŸ¡ã管çããŠããŸãããã㯠MongoDB èªäœã®æ©èœã«å ããŠããšã³ã¿ãŒãã©ã€ãºçŽèŠæ±ãæºããæ¹æ³ã§ãã
MongoDB ã®ã¡ãªãããã¡
æ§èœåªç§æ§
MongoDB ã¯ç¹å®ã®äœ¿çšã±ãŒã¹ã§åªããæ§èœãçºæ®ããŸããCars24 ã®å ŽåãMongoDB Atlas ãçšããŠ3å人ã®ãŠãŒã¶ãŒåãã®æ€çŽ¢ãµãŒãã¹ãæ¹åããã³ã¹ããåæžãããŸããã
MongoDB Atlas Search ãéããŠããŒã¿ããŒã¹å ã§çŽæ¥æ€çŽ¢ã¯ãšãªãå®è¡ã§ãããããå¥éæ€çŽ¢ãšã³ãžã³ãšããŒã¿åæãè¡ãå¿ èŠããªããªããŸãããããã¯ãªã¢ã«ã¿ã€ã æ€çŽ¢çµæãæäŸãã€ã€ãã¢ãŒããã¯ãã£ãç°¡çŽ åããŠããŸãã
é«å¯çšæ§
MongoDB ã®ã¬ããªã«ã»ããã¯èªåé害埩æ§ãæäŸããŸãããã©ã€ããªããŒãã«åé¡ãçºçãããšãçŽ1ç§ä»¥å ã«ã»ã«ã³ããªããŒãããã©ã€ããªããŒãã®åœ¹å²ãåŒãç¶ãããµãŒãã¹åæ¢ãæå°éã«æããŸãããã㯠Raft ã¢ã«ãŽãªãºã ã«åºã¥ãæ€èšŒæžã¿ã®æ¹åŒã§ãã
å©çšã®ãããã
MongoDB Query LanguageïŒMQLïŒã¯ JavaScript ããŒã¹ã§ããŠã§ãéçºè ã«ãšã£ãŠèŠªãã¿ããããŸããJSON ãšé¡äŒŒããææ³ã䜿ãããšã§åŠç¿æ²ç·ãç·©ããã§ãã
// ãŠãŒã¶ãŒæ€çŽ¢ã®äŸ
db.users.find({
$and: [{ "age": { $gte: 18 } },{ "skills": { $in: ["JavaScript", "React"] } },{ "location.city": "ììž" }
]
}).sort({ "createdAt": -1 }).limit(10)
çµ±åãããéçºäœéš
Cars24 ã®äŸã«èŠãããããã«ãMongoDB Atlas ã¯ããŒã¿ä¿åãšæ€çŽ¢æ©èœãäžã€ã®ãã©ãããã©ãŒã ã§æäŸããŸããéçºè ã¯å¥ã®ããŒã«ãåæãæèãããåäžã® API ã§å šãŠã®æäœãåŠçã§ããŸãã
ããã¯éçºè ãã€ã³ããã¯ã¹ç®¡çãããŒã¿åæããããã¢ããªã±ãŒã·ã§ã³éçºãšè£œåæ§ç¯ã«éäžã§ããããã«ããŸãã
çŽ æ©ãéçºè ãªã³ããŒãã£ã³ã°
MongoDB ã«æ £ããéçºè ãè¿ éã«ããŒã ã«è¿ãå ¥ããããšãã§ããŸããããã¯ç¹ã«ã¹ã¿ãŒãã¢ãããæ¥æé·äžã®çµç¹ã§éèŠãªã¡ãªããã§ãã
å®éã®äœ¿çšæã«èæ ®ãã¹ãç¹
MongoDB ã䜿çšããéã«æ³šæãã¹ãç¹ãååšããŸãïŒ
JOIN ã®ä»£ããã«ããŒã¿éè€
MongoDB ã¯äŒçµ±ç㪠JOIN ããµããŒãããŸããã$lookup æŒç®åã䜿ããŸãããRDBMS ã® JOIN ã«æ¯ã¹ãŠæ§èœãèœã¡ãããšããããŸãããããã£ãŠãå¿ èŠãªããŒã¿ãäºåã«éè€ä¿åããããšãæšå¥šãããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³äœ¿çšãæå°å
ãã©ã³ã¶ã¯ã·ã§ã³ããµããŒãããŠããŸãããå€§èŠæš¡ãã©ã³ã¶ã¯ã·ã§ã³ã§ã¯æ§èœäœäžãèµ·ããå¯èœæ§ããããŸããå¯èœã§ããã°åã蟌ã¿ããã¥ã¡ã³ãæ§é ã䜿çšããŠããã©ã³ã¶ã¯ã·ã§ã³ã®å¿ èŠæ§ãæžãããã»ããè¯ãã§ãããã
ã·ã£ãŒãããŒéžæã®éèŠæ§
誀ã£ãã·ã£ãŒãããŒã®éžæã¯æ§èœäœäžãšããŒã¿äžåè¡¡ãæããŸããã·ã£ãŒãããŒã¯ã¯ãšãªãã¿ãŒã³ãšããŒã¿åæ£ãèæ ®ããŠæ éã«éžã¶ã¹ãã§ãã