
[
åç·š ]
ãã®æçš¿ã§ã¯ãæåã®éšåã«åãŸããªããã®ããããŸãã ãããã¯ã
aggregation framework
ã«ããæŒç®åã®äžéšã§ãããWebãµã€ãã®
ãšã³ã·ã¹ãã ã»ã¯ã·ã§ã³ã®3ã€ã®èšäºã
MongoDB
å©ããåããŠããªãèªç±ã«ç¿»èš³ããeã³ããŒã¹ã®äœ¿çšäºäŸã説æããŠããŸãã
䜿çšäºäŸã¯8ã€ã®èšäºã«åãããŠãããæ¡ä»¶ã«å¿ããŠ3ã€ã®ã°ã«ãŒãã«åããããšãã§ããŸãã ç¿»èš³ã«æãè峿·±ãã®ã¯ã
e-commerce
é¢é£ãã3ã€ã®è³æã§ãã
- éçŽãã¬ãŒã ã¯ãŒã¯ã®æŒç®å
- 補åã«ã¿ãã°
- ã«ãŒãããã³åšåº«ç®¡ç
- ã«ããŽãªãŒéå±€
éçŽãã¬ãŒã ã¯ãŒã¯ã®æŒç®å
ååãšããŠã
aggregation framework
ã«ã¯ã
$project
ã
$group
ãªã©ã®åºæ¬çãªæŒç®åãããããããã
pipeline
ãã§ãŒã³ã圢æãããŸãã
ãããã
$cond
ãããªæŒç®åãããããããã¯åžžã«ã¡ã€ã³æŒç®åã®äžã«ãããŸãã
$ condã¯ãæ¬¡ã® å Žåã®éåžžã®è¿äŒŒã¢ããã°ã§ããããŒãžã§ã³
2.6
ããç»å Žãã2ã€ã®èšé²åœ¢åŒããããŸãã
{ $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case-> } } { $cond: [ <boolean-expression>, <true-case>, <false-case> ] }
ããšãã°ã次ã®ããã¥ã¡ã³ãããããŸãã
{ "_id" : 1, "item" : "abc1", qty: 300 } { "_id" : 2, "item" : "abc2", qty: 200 } { "_id" : 3, "item" : "xyz1", qty: 250 }
qty
250
以äžã®å Žåã
discount
ã
30
èšå®ã
discount
ããã以å€ã®å Žåã
discount
ã¯
20
ãªããŸã
db.test.aggregate( [ { $project:{ item: 1, discount: { $cond: { if: { $gte: [ "$qty", 250 ] }, then: 30, else: 20 } } } } ] )
åŸãããçµæïŒ
{ "_id" : 1, "item" : "abc1", "discount" : 30 } { "_id" : 2, "item" : "abc2", "discount" : 20 } { "_id" : 3, "item" : "xyz1", "discount" : 30 }
$ ifNull ã¯ããã£ãŒã«ããååšããnullã§ãªãããšã確èªããŸããã£ãŒã«ãããªãå Žåã¯ãç®çã®å€ã«çœ®ãæããŸãã
{ "_id" : 1, "item" : "abc1", description: "product 1", qty: 300 } { "_id" : 2, "item" : "abc2", description: null, qty: 200 } { "_id" : 3, "item" : "xyz1", qty: 250 }
description
ãã£ãŒã«ããååšããªãã
null
å Žåã
Unspecified
è¿ã
null
ã
db.test.aggregate( [ { $project: { item: 1, description: { $ifNull: [ "$description", "Unspecified" ]}} } ] )
çµæïŒ
{ "_id" : 1, "item" : "abc1", "description" : "product 1" } { "_id" : 2, "item" : "abc2", "description" : "Unspecified" } { "_id" : 3, "item" : "xyz1", "description" : "Unspecified" }
$ let 倿°ãäœæããŸã$let
æŒç®åã¯å€æ°ãäœæãããããã䜿çšããŠããã€ãã®æäœãå®è¡ã§ããŸãã
ãã®äŸã§ã¯ã2ã€ã®å€æ°ã
total
ãäœæãã2ã€ã®ãã£ãŒã«ã
price, tax
åèšã®å€
total
å²ãåœãŠãŸãã è«çæŒç®å
cond
ãè¿ã倿°
discounted
çµæã
ãã®åŸã倿°
total
ãš
discounted
ãæããŠããããã®è£œåãè¿ããŸãã
{ _id: 1, price: 10, tax: 0.50, applyDiscount: true } { _id: 2, price: 10, tax: 0.25, applyDiscount: false } db.test.aggregate( [ { $project: { finalTotal: { $let: { vars: { total: { $add: [ '$price', '$tax' ] }, discounted: { $cond: { if: '$applyDiscount', then: 0.9, else: 1 } } }, in: { $multiply: [ "$$total", "$$discounted" ] } } } } }] ) { "_id" : 1, "finalTotal" : 9.450000000000001 } { "_id" : 2, "finalTotal" : 10.25 }
$ map ã¯åèŠçŽ ã«ç¹å®ã®åŒãé©çšããŸãåŒãåèŠçŽ ã«é©çšããŸãããã®äŸã§ã¯ãé
åã®åèŠçŽ ã«
+2
远å ãããŸãã
{ _id: 1, quizzes: [ 5, 6, 7 ] } { _id: 2, quizzes: [ ] } db.grades.aggregate([{ $project:{ adjustedGrades: {$map: {input: "$quizzes", as: "grade", in: { $add: [ "$$grade", 2 ] } } } } }]) { "_id" : 1, "adjustedGrades" : [ 7, 8, 9 ] } { "_id" : 2, "adjustedGrades" : [ ] }
$ setEquals㯠é
åãæ¯èŒããŸã2ã€ä»¥äžã®é
åãæ¯èŒããé¡äŒŒããèŠçŽ ã
true
å Žåã¯
true
ãè¿ã
true
ã
äŸ | çµæ |
{$ setEqualsïŒ[["a"ã "b"ã "a"]ã["b"ã "a"]]} | æ¬åœ |
{$ setEqualsïŒ[["a"ã "b"]ã[["a"ã "b"]]]} | åœ |
$ setIntersection ã¯äžèŽããèŠçŽ ãè¿ããŸã2ã€ä»¥äžã®é
åãåãåããåå
¥åé
åã«ååšããèŠçŽ ãå«ãé
åãè¿ããŸãã é
åã®1ã€ã空ã§ãããããã¹ããããé
åãå«ãå Žåã空ã®é
åãè¿ããŸãã
äŸ | çµæ |
{$ setIntersectionïŒ[["a"ã "b"ã "a"]ã["b"ã "a"]]} | ["B"ã "a"] |
{$ setIntersectionïŒ[["a"ã "b"]ã[["a"ã "b"]]]} | [] |
$ setUnion ã¯ãä»»æã®å
¥åãã©ã¡ãŒã¿ãŒã«ååšããèŠçŽ ãè¿ããŸãã2ã€ä»¥äžã®é
åãåããä»»æã®å
¥åé
åã«çŸããèŠçŽ ãå«ãé
åãè¿ããŸãã
äŸ | çµæ |
{$ setUnionïŒ[["a"ã "b"ã "a"]ã["b"ã "a"]]} | ["B"ã "a"] |
{$ setUnionïŒ[["a"ã "b"]ã[["a"ã "b"]]]} | [["A"ã "b"]ã "b"ã "a"] |
$ setDifference ãsetUnionã§ããããã®éãåæ§ã§ãäŸ | çµæ |
{$ setDifferenceïŒ[["a"ã "b"ã "a"]ã["b"ã "a"]]} | [] |
{$ setDifferenceïŒ[["a"ã "b"]ã[["a"ã "b"]]]} | [ãAãããbã] |
$ setIsSubset ã¯ãµãã»ããããã§ãã¯ããŸã2ã€ã®é
åãåããæåã®é
åã2çªç®ã®é
åã®ãµãã»ããã§ããå ŽåïŒæåã®é
åã2çªç®ã®é
åãšçããå Žåãå«ãïŒãTrueãè¿ããŸãã
äŸ | çµæ |
{$ setIsSubsetïŒ[["a"ã "b"ã "a"]ã["b"ã "a"]]} | æ¬åœ |
{$ setIsSubsetïŒ[["a"ã "b"]ã[["a"ã "b"]]]} | åœ |
$ anyElementTrueé
åãèŠçŽ ã®ã»ãããšããŠè©äŸ¡ããããããã®èŠçŽ ãTrueã®å ŽåTrueãè¿ãããã®éã®å Žåã¯Falseãè¿ããŸãã 空ã®é
åã¯falseãè¿ããŸãã 1ã€ã®åŒæ°ãåããŸãã
äŸ | çµæ |
{$ anyElementTrueïŒ[[trueãfalse]]} | |
{$ anyElementTrueïŒ[[[false]]]} | |
{$ anyElementTrueïŒ[[nullãfalseã0]]} | |
{$ anyElementTrueïŒ[[]]} | |
$ allElementsTrueé
åããã§ãã¯ããé
åã®1ã€ã®èŠçŽ ãfalseã§ãªãå Žåã¯Trueãè¿ããŸãã ãã以å€ã®å Žåã¯ãfalseãè¿ããŸãã 空ã®é
åã¯Trueãè¿ããŸãã
äŸ | çµæ |
{$ allElementsTrueïŒ[[trueã1ã "someString"]]} | |
{$ allElementsTrueïŒ[[[false]]]} | |
{$ allElementsTrueïŒ[[]]} | |
{$ allElementsTrueïŒ[[nullãfalseã0]]} | |
$ cmp -2ã€ã®èŠçŽ ãæ¯èŒããŸã2ã€ã®èŠçŽ ãæ¯èŒããŠè¿ããŸãã
- æåã®å€ã2çªç®ã®å€ããå°ããå Žåã¯-1ã
- æåã®å€ã2çªç®ã®å€ãã倧ããå Žåã¯1ã
- äž¡æ¹ã®å€ãçããå Žåã¯0ã
{ "_id" : 1, "item" : "abc1", description: "product 1", qty: 300 } { "_id" : 2, "item" : "abc2", description: "product 2", qty: 200 } { "_id" : 3, "item" : "xyz1", description: "product 3", qty: 250 }
$cmp
ã䜿çšããŠã
qty
ãã£ãŒã«ãã®å€ã
250
ãšæ¯èŒããŸãã
db.test.aggregate( [ { $project:{ _id: 0, item: 1,qty: 1, cmpTo250: { $cmp: [ "$qty", 250 ] } } } ] )
çµæïŒ
{ "item" : "abc1", "qty" : 300, "cmpTo250" : 1 } { "item" : "abc2", "qty" : 200, "cmpTo250" : -1 } { "item" : "xyz1", "qty" : 250, "cmpTo250" : 0 }
$ add add { "_id" : 1, "item" : "abc", "price" : 10, "fee" : 2 } { "_id" : 2, "item" : "jkl", "price" : 20, "fee" : 1 } db.test.aggregate([ { $project: { item: 1, total: { $add: [ "$price", "$fee" ] } } } ]) { "_id" : 1, "item" : "abc", "total" : 12 } { "_id" : 2, "item" : "jkl", "total" : 21 }
$æžç® æžç®æ¥ä»ã®å·®ãããªç§åäœã§è¿ãå ŽåããããŸãã
{ "_id" : 1, "item" : "abc", "price" : 10, "fee" : 2, "discount" : 5 } { "_id" : 2, "item" : "jkl", "price" : 20, "fee" : 1, "discount" : 2 } db.test.aggregate( [ { $project: { item: 1, total: { $subtract: [ { $add: [ "$price", "$fee" ] }, "$discount" ] } } } ] ) { "_id" : 1, "item" : "abc", "total" : 7 } { "_id" : 2, "item" : "jkl", "total" : 19 }
$ä¹ç® ä¹ç® { "_id" : 1, "item" : "abc", "price" : 10, "quantity": 2 } { "_id" : 2, "item" : "jkl", "price" : 20, "quantity": 1 } db.test.aggregate([ { $project: { item: 1, total: { $multiply: [ "$price", "$quantity" ] } } } ]) { "_id" : 1, "item" : "abc", "total" : 20 } { "_id" : 2, "item" : "jkl", "total" : 20 }
$é€ç® æŒç®å { "_id" : 1, "name" : "A", "hours" : 80, "resources" : 7 }, { "_id" : 2, "name" : "B", "hours" : 40, "resources" : 4 } db.test.aggregate([ { $project: { name: 1, workdays: { $divide: [ "$hours", 8 ] } } } ]) { "_id" : 1, "name" : "A", "workdays" : 10 } { "_id" : 2, "name" : "B", "workdays" : 5 }
$ concat- ã¹ããªã³ã°é£çµ { "_id" : 1, "item" : "ABC1", quarter: "13Q1", "description" : "product 1" } db.test.aggregate([ { $project: { itemDescription: { $concat: [ "$item", " - ", "$description" ] } } } ]) { "_id" : 1, "itemDescription" : "ABC1 - product 1" }
$ substr ã¯éšåæååãè¿ããŸãéå§ã€ã³ããã¯ã¹ãšå
é ããã®æåæ°ãååŸããŸãã ã€ã³ããã¯ã¹ã¯ãŒãããå§ãŸããŸãã
{ "_id" : 1, "item" : "ABC1", quarter: "13Q1", "description" : "product 1" } { "_id" : 2, "item" : "ABC2", quarter: "13Q4", "description" : "product 2" } db.inventory.aggregate([{ $project:{ item: 1, yearSubstring: { $substr: [ "$quarter", 0, 2 ] }, quarterSubtring: { $substr: [ "$quarter", 2, -1 ] } } }]) { "_id" : 1, "item" : "ABC1", "yearSubstring" : "13", "quarterSubtring" : "Q1" } { "_id" : 2, "item" : "ABC2", "yearSubstring" : "13", "quarterSubtring" : "Q4" }
$ toLower- å°æåã«å€æããŸã { "_id" : 1, "item" : "ABC1", quarter: "13Q1", "description" : "PRODUCT 1" } db.test.aggregate([{ $project:{ item: { $toLower: "$item" }, description: { $toLower: "$description" }} }]) { "_id" : 1, "item" : "abc1", "description" : "product 1" }
$ toUpper ã¯å€§æåã«å€æããŸã { "_id" : 2, "item" : "abc2", quarter: "13Q4", "description" : "Product 2" } db.inventory.aggregate( [ { $project:{ item: { $toUpper: "$item" }, description: { $toUpper: "$description" } } } ] ) { "_id" : 2, "item" : "ABC2", "description" : "PRODUCT 2" }
$ strcasecmp㯠æååãæ¯èŒããŸã2ã€ã®æååãæ¯èŒããŠè¿ããŸãã
- 1è¡ç®ã2è¡ç®ãããã倧ãããå Žåã¯1ã
- 2è¡ãçããå Žåã¯0ã
- æåã®è¡ã2çªç®ã®è¡ããããå°ãããå Žåã¯-1ã
æŒç®åã¯å€§æåãšå°æåãåºå¥ããŸããã
{ "_id" : 1, "item" : "ABC1", quarter: "13Q1", "description" : "product 1" } { "_id" : 2, "item" : "ABC2", quarter: "13Q4", "description" : "product 2" } { "_id" : 3, "item" : "XYZ1", quarter: "14Q2", "description" : null } db.inventory.aggregate([{ $project:{ item: 1, comparisonResult: { $strcasecmp: [ "$quarter", "13q4" ] } } }]) { "_id" : 1, "item" : "ABC1", "comparisonResult" : -1 } { "_id" : 2, "item" : "ABC2", "comparisonResult" : 0 } { "_id" : 3, "item" : "XYZ1", "comparisonResult" : 1 }
æ¥ä»ãæäœãã
ã¢ã«ãŠã³ãã® $ dayOfYear æ¥è«æ±æžã®æã® $ dayOfMonth æ¥$ dayOfWeek ã¯ãã¢ã«ãŠã³ãã®ææ¥ïŒ1ïŒåææ¥ïŒ-7ïŒæ¥ææ¥ïŒïŒãè¿ããŸãã$幎 㯠幎ã è¿ããŸã$ month ã¯ãã¢ã«ãŠã³ãã®æãè¿ããŸã$ week ã¯ãå¹Žã® é± çªå·ã 0ã53ã® æ°å€ãšããŠè¿ããŸã$ hour ã¯ã0ã23ã®æ°å€ãšã㊠æéã è¿ããŸã$ minutes ã¯ã0ã59ã®æ°å€ãšã㊠åã è¿ããŸã$ second ã¯ã0ã23ã®æ°å€ãšããŠç§ãè¿ããŸã$ millisecond ã¯ã0ã999ã®æ°å€ãšã㊠ããªç§ã è¿ããŸãæ¥ä»ã®å¹Žééç®æ¥ã1ã366ã®æ°å€ãšããŠè¿ããŸãã
ããšãã°ã1æ1æ¥ã«1ãè¿ããŸãã
{ "_id": 1, "item": "abc", "date" : ISODate("2014-01-01T08:15:39.736Z") } db.sales.aggregate( [ { $project: { year: { $year: "$date" }, month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, hour: { $hour: "$date" }, minutes: { $minute: "$date" }, seconds: { $second: "$date" }, milliseconds: { $millisecond: "$date" }, dayOfYear: { $dayOfYear: "$date" }, dayOfWeek: { $dayOfWeek: "$date" }, week: { $week: "$date" } } } ] ) { "_id" : 1, "year" : 2014, "month" : 1, "day" : 1, "hour" : 8, "minutes" : 15, "seconds" : 39, "milliseconds" : 736, "dayOfYear" : 1, "dayOfWeek" : 4, "week" : 0 }
$ dateToString ã¯æååã«å€æããŸãæå®ããã圢åŒã«åŸã£ãŠãæ¥ä»ãªããžã§ã¯ããæååã«å€æããŸãã
{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:15:39.736Z") } db.test.aggregate( [ { $project: { yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }, time: { $dateToString: { format: "%H:%M:%S:%L", date: "$date" } } } } ] ) { "_id" : 1, "yearMonthDay" : "2014-01-01", "time" : "08:15:39:736" }
補åã«ã¿ãã°
ãã®ç« ã§ã¯ã
MongoDB
ã䜿çšããŠé»ååååŒã·ã¹ãã ã§è£œåã«ã¿ãã°ãèšèšããåºæ¬çãªååã«ã€ããŠèª¬æããŸãã
ååã®ã«ã¿ãã°ã«ã¯ãããŸããŸãªã¿ã€ãã®ãªããžã§ã¯ããæ ŒçŽã§ããåãªããžã§ã¯ãã«ã¯ç¬èªã®ç¹æ§ãªã¹ããå¿
èŠã§ãã
ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®å Žåãããã©ãŒãã³ã¹ã®éããªã©ãåæ§ã®åé¡ã«å¯Ÿããããã€ãã®è§£æ±ºçããããŸãã ãããã®ãªãã·ã§ã³ã®ããã€ããèŠãŠãããããã
MongoDB
ã©ã®ããã«åŠçããããã確èªããŸãã
SQLããã³ãªã¬ãŒã·ã§ãã«ããŒã¿ã¢ãã«
å
·äœçãªããŒãã«ã®ç¶æ¿ïŒæéã¯ã©ã¹ã®ããŒãã«ã«ããç¶æ¿ïŒãªã¬ãŒã·ã§ãã«ã¢ãã«ã®æåã®ãªãã·ã§ã³ã¯ãååã®ã«ããŽãªããšã«ç¬èªã®ããŒãã«ãäœæããããšã§ãã
CREATE TABLE `product_audio_album` ( `sku` char(8) NOT NULL, ... `artist` varchar(255) DEFAULT NULL, `genre_0` varchar(255) DEFAULT NULL, `genre_1` varchar(255) DEFAULT NULL, ..., PRIMARY KEY(`sku`)) ... CREATE TABLE `product_film` ( `sku` char(8) NOT NULL, ... `title` varchar(255) DEFAULT NULL, `rating` char(8) DEFAULT NULL, ..., PRIMARY KEY(`sku`)) ...
ãã®ã¢ãããŒãã«ã¯ãæè»æ§ã«é¢é£ãã2ã€ã®äž»ãªå¶éããããŸãã
- å®éã«ã¯ãæ°ãã補åã«ããŽãªããšã«æ°ããããŒãã«ãäœæãããŸãã
- ç¹å®ã®ã¿ã€ãã®è£œåã«å¯Ÿããã¯ãšãªã®æç€ºçãªé©å¿ã
åäžããŒãã«ã®ç¶æ¿ãªã¬ãŒã·ã§ãã«ã¢ãã«ã®2çªç®ã®ãªãã·ã§ã³ã¯ããã¹ãŠã®è£œåã«ããŽãªã«åäžã®ããŒãã«ã䜿çšããããšã§ãã ãŸããååã®çš®é¡ã«é¢ããããŒã¿ãä¿åããå¿
èŠãããå Žåã¯ãã€ã§ãæ°ããåã远å ããŸãã
CREATE TABLE `product` ( `sku` char(8) NOT NULL, ... `artist` varchar(255) DEFAULT NULL, `genre_0` varchar(255) DEFAULT NULL, `genre_1` varchar(255) DEFAULT NULL, ... `title` varchar(255) DEFAULT NULL, `rating` char(8) DEFAULT NULL, ..., PRIMARY KEY(`sku`))
ãã®ã¢ãããŒãã¯ããæè»æ§ããããããŸããŸãªã¿ã€ãã®è£œåã«åºã¥ããŠåäžã®ã¯ãšãªãäœæã§ããŸãã
è€æ°ã®ããŒãã«ã®ç¶æ¿ãŸãããªã¬ãŒã·ã§ãã«ã¢ãã«ã§ã¯ããè€æ°ã®ããŒãã«ã®ç¶æ¿ãã䜿çšã§ããŸããããã¯ã補åã®ãã¹ãŠã®ã«ããŽãªã«å
±éã®å±æ§ãã¡ã€ã³
product
ããŒãã«ã«ãããåå¥ã®å±æ§ïŒããããç¬èªã®ã«ããŽãªïŒã«ç°ãªã屿§ãå«ãŸãããã¿ãŒã³ã§ãã
次ã®
SQL
äŸãæ€èšããŠãã ããã
CREATE TABLE `product` ( `sku` char(8) NOT NULL, `title` varchar(255) DEFAULT NULL, `description` varchar(255) DEFAULT NULL, `price`, ... PRIMARY KEY(`sku`)) CREATE TABLE `product_audio_album` ( `sku` char(8) NOT NULL, ... `artist` varchar(255) DEFAULT NULL, `genre_0` varchar(255) DEFAULT NULL, `genre_1` varchar(255) DEFAULT NULL, ..., PRIMARY KEY(`sku`), FOREIGN KEY(`sku`) REFERENCES `product`(`sku`)) ... CREATE TABLE `product_film` ( `sku` char(8) NOT NULL, ... `title` varchar(255) DEFAULT NULL, `rating` char(8) DEFAULT NULL, ..., PRIMARY KEY(`sku`), FOREIGN KEY(`sku`) REFERENCES `product`(`sku`)) ...
ãã®ãªãã·ã§ã³ã¯ãåäžã®ããŒãã«ç¶æ¿ãããå¹ççã§ãåã«ããŽãªã®ããŒãã«ãäœæããããããããã«æè»æ§ããããŸãã ãã®ãªãã·ã§ã³ã§ã¯ãç¹å®ã®è£œåã«é¢é£ãããã¹ãŠã®å±æ§ãååŸããããã«ãé«äŸ¡ãªã
JOIN
ã䜿çšããå¿
èŠããããŸãã
åãšã³ãã£ãã£ã®å±æ§å€ãããŠããªã¬ãŒã·ã§ãã«ã¢ãã«ã®æåŸã®ãã¿ãŒã³ã¯ã
entity-attribute-value
ã¹ããŒãã§ãã ãã®ã¹ããŒã ã«åŸã£ãŠãããšãã°
entity_id
ã
attribute_id
ãããã³å補åã®èª¬æã«äœ¿çšããã
value
3ã€ã®åãæã€ããŒãã«ãäœæãããŸãã
ãªãŒãã£ãªé²é³ãä¿åããäŸãèããŠã¿ãŸãããã
ãšã³ãã£ã㣠| 屿§ | äŸ¡å€ |
sku_00e8da9b | ã¿ã€ã | ãªãŒãã£ãªã¢ã«ãã |
sku_00e8da9b | ã¿ã€ãã« | æé«ã®æ |
sku_00e8da9b | ... | ... |
sku_00e8da9b | ã¢ãŒãã£ã¹ã | ãžã§ã³ã»ã³ã«ãã¬ãŒã³ |
sku_00e8da9b | ãžã£ã³ã« | ãžã£ãº |
sku_00e8da9b | ãžã£ã³ã« | å
šè¬ |
... | ... | ... |
ãã®ã¹ããŒã ã¯éåžžã«æè»ã§ãïŒ
ã©ã®è£œåã«ããä»»æã®å±æ§ã»ãããèšå®ã§ããŸãã æ°ãã補åã«ããŽãªã§ã¯ãããŒã¿ããŒã¹ã倿Žããå¿
èŠã¯ãããŸããã
ãã®ãªãã·ã§ã³ã®çæã¯ã
JOIN
ãå«ãå€ãã®ã¯ãšãªãå¿
èŠã«ãªãããšã§ãããããã¯ããã©ãŒãã³ã¹ã«ããŸãé©ããŠããŸããã
ããã«ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã·ã¹ãã ã䜿çšããäžéšã®
e-commerce
ãœãªã¥ãŒã·ã§ã³ã§ã¯ããã®ããŒã¿ãBLOBåã«ã·ãªã¢ã«åããŸãã ãããŠãååã®å±æ§ãèŠã€ããŠåé¡ããããšãé£ãããªããŸãã
éãªã¬ãŒã·ã§ãã«ããŒã¿ã¢ãã«
mongodb
ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã§
mongodb
ãªãããã補åã«ã¿ãã°ãäœæããæè»æ§ã®èгç¹ãã远å ã®æ©äŒããããŸãã
æåã®ãªãã·ã§ã³ã¯ã1ã€ã®ã³ã¬ã¯ã·ã§ã³ã䜿çšããŠãã¹ãŠã®çš®é¡ã®ããã¥ã¡ã³ããä¿åããããšã§ãã ãŸããããã¥ã¡ã³ãããšã«ä»»æã®ã¹ããŒã ã䜿çšã§ããããã補åã®ãã¹ãŠã®ç¹æ§ïŒå±æ§ïŒã1ã€ã®ããã¥ã¡ã³ãã«ä¿åã§ããŸãã
ææžã®ã«ãŒãã«ã¯ãã«ã¿ãã°å
šäœã®æ€çŽ¢ã容æã«ããããã®è£œåã«é¢ããäžè¬çãªæ
å ±ãå¿
èŠã§ãã ãããŠããã§ã«ãµãããã¥ã¡ã³ãã«ã¯ãåããã¥ã¡ã³ãã«åºæã®ãã£ãŒã«ããããã¯ãã§ãã äŸãèããŠã¿ãŸãããïŒ
{ sku: "00e8da9b", type: "Audio Album", title: "A Love Supreme", description: "by John Coltrane", asin: "B0000A118M", shipping: { weight: 6, dimensions: { width: 10, height: 10, depth: 1 }, }, pricing: { list: 1200, retail: 1100, savings: 100, pct_savings: 8 }, details: { title: "A Love Supreme [Original Recording Reissued]", artist: "John Coltrane", genre: [ "Jazz", "General" ], ... tracks: [ "A Love Supreme Part I: Acknowledgement", "A Love Supreme Part II - Resolution", "A Love Supreme, Part III: Pursuance", "A Love Supreme, Part IV-Psalm" ], }, }
æ ç»ã«é¢ããæ
å ±ãä¿åãããŠããããã¥ã¡ã³ãã®å Žå
{ type: "Film" }
äž»ãªãã£ãŒã«ãã¯ãäŸ¡æ Œãé
éãªã©ã§ãã åããŸãŸã§ãã ãã ãããµãææžã®å
容ã¯ç°ãªããŸãã äŸïŒ
{ sku: "00e8da9d", type: "Film", ..., asin: "B000P0J0AQ", shipping: { ... }, pricing: { ... }, details: { title: "The Matrix", director: [ "Andy Wachowski", "Larry Wachowski" ], writer: [ "Andy Wachowski", "Larry Wachowski" ], ..., aspect_ratio: "1.66:1" }, }
ã»ãšãã©ã®å Žåã補åã«ã¿ãã°ã®äž»ãªæäœã¯æ€çŽ¢ã§ãã 以äžã«äŸ¿å©ãªããŸããŸãªã¿ã€ãã®ã¯ãšãªã瀺ããŸãã ãã¹ãŠã®äŸã¯
Python/PyMongo
ãŸãã
ãžã£ã³ã«å¥ã«ã¢ã«ãã ãæ€çŽ¢ãããªãªãŒã¹å¹Žã§äžŠã¹æ¿ããŸããã®ã¯ãšãªã¯ãç¹å®ã®ãžã£ã³ã«ã«å¯Ÿå¿ããæ°ããé ã«äžŠã¹æ¿ããããååãå«ãããã¥ã¡ã³ããè¿ããŸãã
query = db.products.find({'type':'Audio Album', 'details.genre': 'jazz'}).sort([('details.issue_date', -1)])
ãã®ã¯ãšãªã§ã¯ãã¯ãšãªããã³äžŠã¹æ¿ãã§äœ¿çšããããã£ãŒã«ãã«ã€ã³ããã¯ã¹ãå¿
èŠã§ãã
db.products.ensure_index([ ('type', 1), ('details.genre', 1), ('details.issue_date', -1)])
å²åŒçã§éé ã§äžŠã¹æ¿ãããã補åãæ€çŽ¢ããŸããã»ãšãã©ã®ãªã¯ãšã¹ãã¯ç¹å®ã®ã¿ã€ãã®è£œåïŒã¢ã«ãã ãæ ç»ãªã©ïŒã«å¯Ÿãããã®ã§ãããå€ãã®å Žåãç¹å®ã®äŸ¡æ Œåž¯ã§ãã¹ãŠã®ååãè¿åããå¿
èŠããããŸãã
ãã¹ãŠã®ããã¥ã¡ã³ãã«ããäŸ¡æ Œãã£ãŒã«ãã䜿çšããŠæ€çŽ¢ããããã«ãå²åŒãæå¹ãªè£œåãæ€çŽ¢ããŸãã
query = db.products.find( { 'pricing.pct_savings': {'$gt': 25 }).sort([('pricing.pct_savings', -1)])
ãã®ã¯ãšãªã§ã¯ã
pricing.pct_savings
ãã£ãŒã«ãã«ã€ã³ããã¯ã¹ãäœæããŸãã
db.products.ensure_index('pricing.pct_savings')
MongoDB
ã¯ãã€ã³ããã¯ã¹ãæé ãŸãã¯éé ã§èªã¿åãããšãã§ããŸãã
æåãªä¿³åªãæŒãããã¹ãŠã®æ ç»ãèŠã€ããããã¥ã¡ã³ãã¿ã€ãã
"Film"
ã§ãããã¥ã¡ã³ã屿§ã®å€ã
{ 'actor': 'Keanu Reeves' }
ããã¥ã¡ã³ããèŠã€ããŸãã çµæãæ¥ä»ã§éé ã«äžŠã¹æ¿ããŸãã
query = db.products.find({'type': 'Film', 'details.actor': 'Keanu Reeves'}).sort([('details.issue_date', -1)])
ãã®ã¯ãšãªã§ã¯ã次ã®ã€ã³ããã¯ã¹ãäœæããŸãã
db.products.ensure_index([ ('type', 1), ('details.actor', 1), ('details.issue_date', -1)])
ã€ã³ããã¯ã¹ã¯ãã¹ãŠã®ããã¥ã¡ã³ãã«ãã
type
ãã£ãŒã«ãã§å§ãŸãã
details.actor
ãã£ãŒã«ãã«æ²¿ã£ãŠé²ããããæ€çŽ¢é åãçµã蟌ã¿ãŸãã ãããã£ãŠãã€ã³ããã¯ã¹ã¯æã广çã§ãã
ã¿ã€ãã«ã«ç¹å®ã®åèªãå«ããã¹ãŠã®æ ç»ãèŠã€ããããŒã¿ããŒã¹ã®çš®é¡ã«é¢ä¿ãªããåèªã«ããæ€çŽ¢ã¯ãšãªãå®è¡ããã«ã¯ãããŒã¿ããŒã¹ãçµæãååŸããããã«ããã¥ã¡ã³ãã®äžéšãã¹ãã£ã³ããå¿
èŠããããŸãã
Mongodb
ã¯ãã¯ãšãªã§æ£èŠè¡šçŸããµããŒãããŠããŸãã Pythonã§ã¯ã
re
ã¢ãžã¥ãŒã«ã䜿çšããŠæ£èŠè¡šçŸãäœæã§ããŸãã
import re re_hacker = re.compile(r'.*hacker.*', re.IGNORECASE) query = db.products.find({'type': 'Film', 'title': re_hacker}).sort([('details.issue_date', -1)])
Mongodbã¯æ£èŠè¡šçŸçšã®ç¹å¥ãªæ§æãæäŸãããããã¯ãšãªã§ã¯
re
ã¢ãžã¥ãŒã«ãªãã§å®è¡ã§ããŸãã åã®äŸã«ä»£ããæ¬¡ã®äŸãæ€èšããŠãã ããã
query = db.products.find({ 'type': 'Film', 'title': {'$regex': '.*hacker.*', '$options':'i'}}).sort([('details.issue_date', -1)])
$options
ç¹å¥ãªæŒç®åã§ãããã®å Žåãæ€çŽ¢èªã§å€§æåãšå°æåãåºå¥ãããªãããšã瀺ããŸãã
ã€ã³ããã¯ã¹ãäœæããŸãã
db.products.ensure_index([ ('type', 1), ('details.issue_date', -1), ('title', 1) ])
ãã®ã€ã³ããã¯ã¹ã䜿çšãããšãããã¥ã¡ã³ãå
šäœã®ã¹ãã£ã³ãåé¿ã§ããŸããã€ã³ããã¯ã¹ã®ãããã§ã
title
ãã£ãŒã«ãã®ã¿ãã¹ãã£ã³ãããŸãã
ã·ã£ãŒãã£ã³ã°
ã¹ã±ãŒãªã³ã°ã®ããŒã¿ããŒã¹ããã©ãŒãã³ã¹ã¯ã€ã³ããã¯ã¹ã«äŸåããŸãã ã·ã£ãŒãã£ã³ã°ã䜿çšããŠããã©ãŒãã³ã¹ãåäžããããšã倧ããªã€ã³ããã¯ã¹ãRAMã«åãŸããŸãã
ã·ã£ãŒãèšå®ã§ã
shard key
éžæã
shard key
ãããã«ããã
mongos
èŠæ±ãã·ã£ãŒããŸãã¯ã·ã£ãŒãã®å°ããªã°ã«ãŒãã«çŽæ¥ã«ãŒãã£ã³ã°ã§ããŸãã
type
ãã£ãŒã«ãã¯ã»ãšãã©ã®ãªã¯ãšã¹ãã«ååšããããã
shard key
å«ããããšãã§ã
shard key
ã
shard key
æ®ãã«ã€ããŠã¯ã以äžãèæ
®ããŠãã ããïŒ
details.issue_date
shard key
ã¯å«ãŸããŸããããã®ãã£ãŒã«ãã¯ãªã¯ãšã¹ãã«ã¯ååšããããœãŒãã«ã®ã¿ååšããããã§ããdetail
å«ãŸããé »ç¹ã«èŠæ±ããã1ã€ä»¥äžã®ãã£ãŒã«ããå«ããå¿
èŠããããŸãã
次ã®äŸã§ã¯ã
details.genre
ãã£ãŒã«ãã
type
次ãã§2çªç®ã«éèŠãªãã£ãŒã«ãã§
type
ãŸãã
Python/PyMongo
ã·ã£ãŒãã£ã³ã°ãåæåãã
>>> db.command('shardCollection', 'product', { key : { 'type': 1, 'details.genre' : 1, 'sku':1 } } ) { "collectionsharded" : "details.genre", "ok" : 1 }
倱æãã
shard key
ãäœæãããšããŠããã·ã£ãŒãã£ã³ã°ã«åœ¹ç«ã¡ãŸãïŒ
- ã·ã£ãŒãã£ã³ã°ã¯ãã€ã³ããã¯ã¹ã®ä¿åã«äœ¿çšã§ãã倧éã®RAMãæäŸããŸãã
MongoDB
ã¯ãã·ã£ãŒãéã§ã¯ãšãªã䞊ååããé
å»¶ãåæžããŸãã
èªæž
ã·ã£ãŒãã£ã³ã°ã¯ã¹ã±ãŒãªã³ã°ã«é©ããæ¹æ³ã§ãããäžéšã®ããŒã¿ã»ããã¯ã
mongos
ã¯ãšãªãç®çã®ã·ã£ãŒãã«èªå°ãããããªæ¹æ³ã§åå²ããããšã¯ã§ããŸããã
ãã®å Žåã
mongos
ã¯ãã¹ãŠã®ã·ã£ãŒãã«ããã«ãªã¯ãšã¹ããéä¿¡ãããã®çµæããã§ã«ã¯ã©ã€ã¢ã³ãã«è¿ãããŸãã
ã©ã®ã·ã£ãŒããèªãããšãæãŸããããæç¢ºã«ç€ºããŠãããããçç£æ§ããããã«é«ããããšãã§ããŸãã
次ã®äŸã®
SECONDARY
ããããã£ã䜿çšãããšãæ¥ç¶å
šäœã®ã»ã«ã³ããªããŒãïŒããã³ãã©ã€ããªããŒãïŒããã®èªã¿åããå¯èœã«ãªããŸãã
conn = pymongo.MongoClient(read_preference=pymongo.SECONDARY)
SECONDARY_ONLY
ã¯ãã¯ã©ã€ã¢ã³ããã»ã«ã³ããªã¡ã³ãããã®ã¿èªã¿åãããšãæå³ããŸãã
conn = pymongo.MongoClient(read_preference=pymongo.SECONDARY_ONLY)
ç¹å®ã®ãªã¯ãšã¹ãã«
read_preference
ãæå®ããããšãã§ããŸããããšãã°ã次ã®ãšããã§ãã
results = db.product.find(..., read_preference=pymongo.SECONDARY)
ãŸãã¯
results = db.product.find(..., read_preference=pymongo.SECONDARY_ONLY)
ã«ãŒãããã³åšåº«ç®¡ç
ãªã³ã©ã€ã³ã¹ãã¢ã®ãŠãŒã¶ãŒã¯å®æçã«ããã¹ã±ãããã«ã¢ã€ãã ã远å ããã³åé€ãããããå庫å
ã®ååã®éã¯è³Œå
¥äžã«äœåºŠãçµ¶ããå€åããå¯èœæ§ããããŸããããã«ãã¹ãã¢ãŠãŒã¶ãŒã¯ãã€ã§ã賌å
¥ãæåŠããä»ã®äºæããªãåé¡ãçºçããããšããããŸã解決ããã«ã¯ã泚æããã£ã³ã»ã«ããå¿
èŠããããŸãã
ããããã¹ãŠã«ãããå庫ã§å
¥æå¯èœãªååã远跡ããã®ãå°ãé£ãããªãå¯èœæ§ãããããŠãŒã¶ãŒãæ¢ã«äºçŽãããŠããååãã賌å
¥ãã§ããªãããã«ããå¿
èŠããããŸãã
ãããã£ãŠããã¹ã±ããã«ã¯æéããããŸãããã®éããã¹ã±ãããéã¢ã¯ãã£ãã ã£ãå ŽåãäºçŽãããååã¯ä»ã®å
šå¡ãåã³å©çšã§ããããã«ãªãããã¹ã±ããã¯ç©ºã«ãªããŸãã

åå庫åšåº«åäœïŒ
SKU ;ãŸãã¯ã¢ã€ãã ïŒã®çŸåšã®åšåº«éãå«ãããã¥ã¡ã³ããããã³ããããã®ååã®æ°éãå«ããã¹ã±ããã®ãªã¹ãã¯ã
Inventory
ã³ã¬ã¯ã·ã§ã³ã«ä¿åããå¿
èŠããããŸãã ãã®åŸãå©çšå¯èœãªæ®é«ããã¹ã±ããã«å
¥ã£ãŠããã°è¿åŽã§ããŸãããã¯ã©ã€ã¢ã³ãã¯ãã°ãããã¹ã±ããã䜿çšããŸããã§ããã
次ã®äŸã§ã¯ã
SKUãæ ŒçŽãã
_id
ãã£ãŒã«ã
ãã®äŸã§ã¯ãã·ã³ãã«ãªã¹ããŒã ã䜿çšãããŠããŸããçç£ã§ã¯ããã®ã¹ããŒã ã第2ç« ã§èª¬æããååã®ã«ã¿ãã°ãšçµã¿åãããããšãã§ããŸãããã¹ã±ããã®éåžžã®ã¢ããªã³ã°ã«ã¯ãSKUãquantity
ãã£ãŒã«ããããã³item_details
éå¶
ãã¹ã±ãããžã®ã¢ã€ãã ã®è¿œå ãã¹ã±ããã
䜿çšããéã®äž»ãªãã€ã³ãã¯ãå庫å
ã®æ¢åã®åšåº«ãããã¹ã±ãããžã®ååã®ç§»åã§ãã
æ¢ã«äºçŽããååããã¹ã±ããã«å
¥ããªãããšãéèŠã§ãã颿°ã䜿çšããŠãããå®è£
ããŸãadd_item_to_cart
ã
def add_item_to_cart(cart_id, sku, qty, details): now = datetime.utcnow()
, _id
.
â , . , .
, .
, , .
def update_quantity(cart_id, sku, old_qty, new_qty):
, , .
def checkout(cart_id): now = datetime.utcnow()
, pending
. , .
- ,
cart_id
inventory
. complete
. - , , .
.
.
timeout
.
def expire_carts(timeout): now = datetime.utcnow() threshold = now - timedelta(seconds=timeout)
:
status
last_modified
.
db.cart.ensure_index([('status', 1), ('last_modified', 1)])
.
: , inventory
, , , .
, inventory
carted
.
def cleanup_inventory(timeout): now = datetime.utcnow() threshold = now - timedelta(seconds=timeout)
«carted» , , timeout
. :
, shard key
_id
, _id
.
mongos
_id
mongod
.
_id
shard key
.
_id
cart
, .
, , ( MD5 SHA-1) ObjectID, _id.
:
import hashlib import bson cart_id = bson.ObjectId() cart_id_hash = hashlib.md5(str(cart_id)).hexdigest() cart = { "_id": cart_id, "cart_hash": cart_id_hash } db.cart.insert(cart)
, , _id
shard key
.
, , ( Sleep ()
), .
Python/PyMongo :
>>> db.command('shardCollection', 'inventory', 'key': { '_id': 1 } ) { "collectionsharded" : "inventory", "ok" : 1 } >>> db.command('shardCollection', 'cart', 'key': { '_id': 1 } ) { "collectionsharded" : "cart", "ok" : 1 }
ã«ããŽãªããªãŒãååã§ã¢ãã«åããŸããåã«ããŽãªã¯ãç¥å
ã®ãªã¹ããŸãã¯èŠªã®ãªã¹ããæã€ããã¥ã¡ã³ãã«ä¿åãããŸããããšãã°ããžã£ã³ã«ã®ãªã¹ãã䜿çšããŸãã
ãããã®ã«ããŽãªã®ã¿ã€ãã¯é »ç¹ã«å€æŽãããªããããã¢ããªã³ã°ã§ã¯ãæŽæ°æäœã®ããã©ãŒãã³ã¹ã§ã¯ãªããéå±€ã®ç¶æã«å¿
èŠãªæäœã«çŠç¹ãåœãŠãŸãããã®åè·¯ã«ã¯æ¬¡ã®ç¹æ§ããããŸãã- ããªãŒã®åã«ããŽãªã¯ã1ã€ã®ããã¥ã¡ã³ãã§è¡šãããŸãã
Objectid
å
éšçžäºåç
§ã®åã«ããŽãªãŒææžãèå¥ããŸãã- ã«ããŽãªãæã€åããã¥ã¡ã³ãã«ã¯ã人éãèªããååãšãéåžžã®URLãæã€ãã£ãŒã«ãããããŸãã
- ã¹ããŒãã¯ã1ã€ã®ã¯ãšãªã®ã¿ã䜿çšããŠãã¹ãŠã®ç¥å
ã®ååŸã容æã«ããããã«ãåã«ããŽãªã®ç¥å
ã®ãªã¹ããä¿æããŸãã
次ã®ãããã¿ã€ããæ€èšããŠãã ããã { "_id" : ObjectId("4f5ec858eb03303a11000002"), "name" : "Modal Jazz", "parent" : ObjectId("4f5ec858eb03303a11000001"), "slug" : "modal-jazz", "ancestors" : [ { "_id" : ObjectId("4f5ec858eb03303a11000001"), "slug" : "bop", "name" : "Bop" }, { "_id" : ObjectId("4f5ec858eb03303a11000000"), "slug" : "ragtime", "name" : "Ragtime" } ] }
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãEã³ããŒã¹ãœãªã¥ãŒã·ã§ã³ã§å¿
èŠã«ãªãå¯èœæ§ã®ããã«ããŽãªããªãŒæäœæäœã«ã€ããŠèª¬æããŸãããã¹ãŠã®äŸã§ã¯ãPython/PyMongo
Reading and DisplayingRequest ã«ããŽãªã䜿çšããŸããæ¬¡ã®ãªãã·ã§ã³ã䜿çšããŠãã«ããŽãªããªãŒãèªã¿åã£ãŠè¡šç€ºããŸãããã®ãªã¯ãšã¹ãã§ã¯ããã£ãŒã«ãã䜿çšããŠslug
ãã«ããŽãªã«é¢ããæ
å ±ãè¿ããŸãâbread crumbâ
category = db.categories.find({'slug':slug}, {'_id':0, 'name':1, 'ancestors.slug':1, 'ancestors.name':1 })
ãã£ãŒã«ãã«äžæã®ã€ã³ããã¯ã¹ãäœæããŸãslug
ã >>> db.categories.ensure_index('slug', unique=True)
ã«ããŽãªãŒã®è¿œå ã«ããŽãªãŒã远å ããã«ã¯ãæåã«ãã®ç¥å
ãå®çŸ©ããå¿
èŠããããŸããæ°ããã«ããŽãªãŒã远å ããŸã-å³ã«ç€ºãããã«Swing
ãã«ããŽãªãŒã®åå«Ragtime
ãšããŠïŒ
ç¥å
ãé€ããŠãã«ããŽãªãŒã远å ããæäœã¯éåžžã«ç°¡åã§ããç¥å
ãé
åã«è¿œå ããã«ã¯ã次ã®é¢æ°ãæ€èšããŠãã ããã def build_ancestors(_id, parent_id): parent = db.categories.find_one({'_id': parent_id}, {'name': 1, 'slug': 1, 'ancestors':1}) parent_ancestors = parent.pop('ancestors') ancestors = [ parent ] + parent_ancestors db.categories.update({'_id': _id}, {'$set': { 'ancestors': ancestors } })
ããªãŒã1ã¬ãã«äžã«ç§»åããç¥å
ã®ãªã¹ããååŸããRagtime
å¿
èŠããããŸããããã䜿çšããŠãç¥å
ã®ãªã¹ããäœæã§ããŸãSwing
ãæ¬¡ã«ãããã¥ã¡ã³ããäœæããæ¬¡ã®å€ãèšå®ããŸãã doc = dict(name='Swing', slug='swing', parent=ragtime_id) swing_id = db.categories.insert(doc) build_ancestors(swing_id, ragtime_id)
æ°ããã«ããŽãªã远å ããæäœã§ã¯ãããã©ã«ãã®ã€ã³ããã¯ã¹ã§_id
ã«ããŽãªã®ç¥å
ã倿Žã§ããŸããã®ã»ã¯ã·ã§ã³ã§ã¯ãããªãŒã倿Žããã«ããŽãªã®bop
äžã«ã«ããŽãªãé
眮ããããã»ã¹ãæ€èšããŸãswing
ã
ããã¥ã¡ã³ãbop
ãæŽæ°ããŠã芪ã®å€ã倿ŽããŸãã db.categories.update({'_id':bop_id}, {'$set': { 'parent': swing_id } } )
次ã®é¢æ°ã¯ãå
ç¥ãä¿åãããŠãããã£ãŒã«ããåæ§ç¯ããŸãã def build_ancestors_full(_id, parent_id): ancestors = [] while parent_id is not None: parent = db.categories.find_one({'_id': parent_id}, {'parent': 1, 'name': 1, 'slug': 1, 'ancestors':1}) parent_id = parent.pop('parent') ancestors.append(parent) db.categories.update({'_id': _id}, {'$set': { 'ancestors': ancestors } })
次ã®ã«ãŒãã䜿çšããŠããã¹ãŠã®åå«ãåæ§ç¯ã§ããŸã bop
for cat in db.categories.find({'ancestors._id': bop_id}, {'parent': 1}): build_ancestors_full(cat['_id'], cat['parent'])
ancestors._id
æŽæ°æäœã«å¿
èŠãªãã£ãŒã«ãã®ã€ã³ããã¯ã¹ãäœæããŸãã db.categories.ensure_index('ancestors._id')
ã«ããŽãªã®ååã倿Žããã«ããŽãªã®ååã倿Žããã«ã¯ãã«ããŽãªèªäœãšãã¹ãŠã®åå«ã®äž¡æ¹ãæŽæ°ããå¿
èŠããããŸããæ¬¡ã®å³ã«ç€ºãããã«ãã«ããŽãªãBopãã®ååããBeBopãã«å€æŽããããšãæ€èšããŠãã ãã
ãæåã«ããããšã¯ãã«ããŽãªã®ååã倿Žããããšã§ãã db.categories.update({'_id':bop_id}, {'$set': { 'name': 'BeBop' } })
次ã«ãååå«ã¯ç¥å
ã®ãªã¹ããæŽæ°ããå¿
èŠããããŸãã db.categories.update({'ancestors._id': bop_id}, {'$set': { 'ancestors.$.name': 'BeBop' } }, multi=True)
ãã®æäœã§ã¯ä»¥äžã䜿çšããŸãã- äœçœ®æŒç®å$ã¯ç¢ºå®ã«ç¥ããªãã§åžæã®å
ç¥ãèŠã€ããŸã
_id
ã multi
æ¡ä»¶ã®å¯Ÿè±¡ãšãªããã¹ãŠã®ããã¥ã¡ã³ããæŽæ°ããå¿
èŠãããããšã瀺ããªãã·ã§ã³ã
ãã®æŽæ°çšã®ã€ã³ããã¯ã¹ã¯æ¢ã«ããancestors._id
ãŸããã·ã£ãŒãã£ã³ã°ãã®ã³ã¬ã¯ã·ã§ã³ã¯éåžžã«å°ããããããã®ã³ã¬ã¯ã·ã§ã³ãã·ã£ãŒãã£ã³ã°ã»ãšãã©ã®å Žåã¯ãå¶éãããå€ã§ããã·ã£ãŒããå¿
èŠãªå Žåãshard key
ãã£ãŒã«ãã¯é©å_id
ã§ãã >>> db.command('shardCollection', 'categories', { 'key': {'_id': 1} }) { "collectionsharded" : "categories", "ok" : 1 }
PS PMã«æžã蟌ãããã®ææ³ãšã©ãŒãšç¿»èš³ãšã©ãŒã®ãªã¯ãšã¹ããäœ¿çšææïŒãšã³ã·ã¹ãã MongoDBéçŽãã¬ãŒã ã¯ãŒã¯ã® ãªãã¬ãŒã¿ãŒã«é¢ãããã«ãããŒããŒãªãã¡ã¬ã³ã¹ããã¶ã€ã³ãã¿ãŒã³ãïŒruïŒã®ã·ã£ãŒãã£ã³ã°ã«é¢ããèšäº