Big Data Withe MongoDB).pdf · 2014. 10. 26. · 102 ٝؾ ی ٕٝیٕض mongoDB ته٘. 4...

Post on 12-Oct-2020

3 views 0 download

Transcript of Big Data Withe MongoDB).pdf · 2014. 10. 26. · 102 ٝؾ ی ٕٝیٕض mongoDB ته٘. 4...

Big Data Withe MongoDB Now you can behave faster…

masoumeh ebhami

www.Aiapir.com

1

دیف فشبض

زا زض ذسز قب زؾشب ػعیع لطاض وشبة زی ثی ضذسا ضا قبوط و ساؿش ا یطایف ز اظ

ضظ زض اذشیبض قب ػعیعا لطاض ؾؼی ثط ای اؾز و غبت ػسیس زض ضز ای دبیب زاز ضا ثب سػ ث ػ

ز.

ذاكس ؿش و ثب اشمبز دیكبزار ذز طا زض ای ضا یبضی ویس

ؼه اثبی

92-93 بظؿش

برداشت پژوهشی با ذکر منبع بال مانع می باشد

2

فطؾز

4 فه ا

mongoDBؼطفی

9 فه ز

mongoDBفبی ػز زض

14 فه ؾ

mongoDBقطع وبض ثب

24 فه چبض

دطؼ ػب

36 فه دؼ

Sharding

43 فه قك

Aggregation ب

51 فه فش

ایسوؽ صاضی

60 فه كش

mongoDBسیطیز زض دبیبز زاز ی

3

77 فه

Replication

83 فه ز

Php mongodb

89 فه یبظز

GridFS

93 ضی ی یه

Wire Protocol-

Data Files-

Namespaces and Extents-

Memory-Mapped Storage Engine-

97 ضی ی ز

دبیب زاز shellآقبیی ثب

102 ؾضی ی

mongoDBهت

4

mongoDBؼطفی

5

mongoDB میبؼ دصیط اؾز.ای دبیب زاز سابیی ؼغف ,یه دبیب زاز لیscale

out وطز ذیی اظ یػی بی دبیب زاز بی ضاثغ ای ظ ایسوؽ صاضی زا ی

دطؼ ػب شذیط ؾبظی ضا زاضا ی ثبقس.

mongoDB ث عض ثبض ىطزی دط یػی اؾز.ذیی اظ یػی ب ظbuilt-in ثز

MapReduce-style aggregation MapReduce-styleدكشیجبی وطز اظ

aggregation و ثؼسا زض ضز طوسا غبجی ضا ذای آذز. زاضا ی ثبقسضا

mongoDB یه س زاز ایDeveloper دؿس زاضای دیىطثسیadministrator دؿس

اؾز

ضا زاضا ی دبیب زاز shellب Driverثؾی ی ػیبی ظثب بی API چی زاضای

. بقسث

mongoDB ذیط ی اظ كى شثطب یؿی ثس طاؾی سالـ ی وس و ضا قب ضا ث

زاز ب سغییط ثسس

mongoDB .زی انی ثطای وبض یه دبیب زاز ؾسطا اؾز یه دبیب زاز ی ضاثغ ای

اؾز اب ؾبیط mongoDBظثب ثز scale out سابیی ساقش زیشبثیؽ بی ضاثغ ای

زاضز.یع عایببی زیط ضا

ثب یه س اؼغبف دصیطسط ث rowػبیعی وطز ف mongoDBعطاحی ایس ی دبی زض

ث وبضثط ی زساؾز ؾسطایی اىب ایؼبز ؾس بی زاذی آضای ب ضا documentب

.ضا ی ثبقسایع ز ثز زیشبثیؽ ضایب ثس قب scheme-less چی

Easy scaling

6

ثب سػ ث ؾطػز ضقس حؼ زاز ب دیكطی زض ای سىغی حؼ اعالػبسی و زض دبیب

احؿبؼ سیطیز ػبؼی ازاض وطز ای اعالػبر ظیبز ثطای زاز یبظ ث شذیط ؾبظی زاضس

قز. ی

چ دبیب زاز ذز ضا میبؼ دصیط وی؟

ی ضؾیعی ثطای میبؼ دصیط وطز دبیب زاز ث ز

1-scalling up)ثعضي وطز بقی ب(

2-scalling out)دبضسیك ثسی وطز زض ثی چسی بقی(

اظ آؼبیی و ایؼبز بقی ثعضي مط ث نطف یؿز چی یبظ ث فضبی ثعضشطی زاضز

scalling out وبضایی ز و ثطای اضبف وطز ثبال ثطزاؾ سط الشهبزی سطوطز سؾؼ دصیط

)ثؼسب زض ای وشبة ی سا یه ؾطض بؾت ذة ذطیساضی وطز ث ؼػ ذز اضبف وطز.

ث ای ؼػ والؾشط یع فش ی قز(

mongoDB ثط دبی یscale out ؾسطا ثز س زاز ب ای اػبظ اؾز قس عطاحیثز

ضا ی زس و زاز ب ث عض ػساب زض ضی چسی ؾطض درف قس و زاز ب ز وطز

س و زیه ط ضا ث سؼبز ی ضؾ.سظیغ ؼسز زؾش ب اسبسیه اؾز و ای اىب ضا ی

یف ثطب یؿب ثس طای اظ شذیط زاز ب ضی ثطب یؿی سطوع وس ثطای افعا

ظطفیز زاز ب سب یبظ ث سی ی یه ؾطض زاقش ثبقس ث آؾبی كى ایى چ زاز

ب ضا شذیط وی ح ی قز.

یػی ب

غ زض مبیؿ ثب دبیب زاز بی ضاث .چ ثیب وی mongoزض كى اؾز و یػی ب ضا

طای زیط؟ؿ ثب زیط دبیب زاز بی ؾسای یب زض مبی

7

الؼب ذة اؾز اثعاضبی حهطث فطزی زاضز و mongoDBذالن حطف ای اؾز و

زیط شببی ضلیجف ساضس.

Indexing : generic secondary indexes دطؼ ػبی ؾطیغ یىشبیی

compound لبثیز geospatial indexing ث ذثی دكشیجبی ی وس.ضا

JavaScriptاجبقش ی

valueاظ ساثغ ,ػال ثط شذیط ؾبظیسیس وس ب ی ساس , ثؼبی شذیط ؾبظی ضی ب

ب زض ؾز ؾطض اؾشفبز وس.

Aggregation

دكشیجبی ی وس. Aggregation زیط اثعاضبی MapReduceاظ

Fixed-size collections

Capped collections زاضای اساظ طبثشی ؿشس و ای یػی فیس اؾز ثطای ع كرهی

ب. logsاظ زاز ب ظ

File storage

mongoDB .اظ یه دطسى ؾبز ثطای شذیط ؾبظی زاز ب اؾشفبز ی وس

ػز mongoDBثؼضی اظ یػی ب ثب دبیب زاز بی ضاثغ ای كشطن اؾز اب ثؼضی زض

ؾغطی .ظیطا دیبز ؾبظی ای یػی ب زض س ب یب سطاوف بی دیچیس چ join ساضز ظ

ؾیؿش بی سظیغ یبفش كى اؾز.

وبضایی ثبال ثس اسالف ؾطػز

اؾز اظ ظب عطاحی ث اػطا زضآس اؾز و اظ mongoDBوبضایی ثبضىطزی سف االی

دطسى بی ؾیی ثبیطی ث ػا ز انی ثطای فؼ افؼبالر ثب ؾطض اؾشفبز ی وس.

8

ذیی لسضسس اؾز ؾؼی زض زاقش ذیی اظ یػی بی دبیب زاز mongoDBاطچ

بی ضاثغ ای ضا زاقش ی اشربة ذثی ثطای اؼب طچیعی و سؾظ دبیب زاز بی ضاثغ

ای اؼب ی قز یؿز .

غمی ؾز والیز اؼب یطز و ای offloadزض ط ظبی ى اؾز دطزاظـ ث نضر

قس اؾز. mongoDBعطاحی ؾجت ثبال ثطز وبضایی

مدیریت آسان

mongoDB سالـ ث ؾبز ؾبظی سیطیز ثطاؾبؼ

ػال ثط ضا اساظی ؾطض دبیب زاز یبظ ث ذیی اظ سیطیز بی ضیع زاضی اط یه ؾطض

master ذبـ قز ث نضر اسبسیه یه ؾطضslave ػبیعی ؾطضmaster .ی قز

ای اؾز و ؾطض ثبیس ازاض قز سب حس اىب دیىطثسی mongoDBفؿف ی سیطیز زض

اسبسیه ای اػبظ ضا ی زس و وبضثطا اسهبشكب ضا زض نضر یبظ ثبال ثجطس.

9

mongoDBفبی ػز زض

ی دطزاظی mongoDBزض ای فه ث ثطضؾی فبی ػز زض

11

Document ؾس(یه احس دبی ثطای زاز ب اؾز فی قجی ضزیف زض دبیب زاز بی(

ضاثغ ای اؾز

Collection ؼػ (ی سا ثطاثط یه ػس ثس قب ؿز(

ی ساس یه ط ؿشظ اظ دبیب زاز ب ثبقس و ط وسا ؼػ mongoDBیه ظب اظ

ب زؾشطؾی بی ذبل ذز ضا زاضز.

mongoDB اظ یه دؾش ی ؾبز یjavaScript ثػز آس اؾز

و زض ثی ؾس بی یه ؼػ یىشب ؿز. "id_"ط ؾس زاضای یه ویس رهل

Documents

ثیب ی قز objectب ث ػا یه زض ػبا اؾىطیذز ؾس

{ “ greeting” : “hello!” }

اؾز یب ی ساس دیچیس !helloثب اضظـ greetingزض ای ؾس ؾبز و حشی یه ویس ث ب

ثبقس ظ

{“greeting” : “hello!” , “number” : 3}

ای ظب ث ذثی چسی ف ضا ثیب ی وس

اضظقف زض ؾس ث سطسیت ؿشس ثبثطای ز ؾس ظیط ثب سفبر زاضسسطویت ویس 1.

{“number” : 3, ”greeting” : ”hello!” }

{“greeting” : “hello!” , “number” : 3}

.مساضب زض یه ؾس ى اؾز چسی ع ثبقس ظال زض ظب ثبال ع ضقش زاضی 2

ع ػسز.

11

(\0ثبقس) null.ویس ب جبیس زاضای وبضاوشط 3

قطع ی قس ث ػا ویس بی ضظ قس غطح ی قس اطچ اػجبضی _.ویس بی و ثب 4

زض ای ضز ػز ساضز.

mongoDB type-sensitive case-sensitive اؾز ثسی ؼی و اؾبز ظیط ثب سفبر

زاضس

{"foo" : 3}

{"foo" : "3"}

{"foo" : 3}

{"Foo" : 3}

: بیی ىش ی

ی ساس قب ویس بی سىطاضی ثبقس.ثب ای حؿبة ؾس ظیط mongoDBؾسب زض

غیطلبی اؾز

{“greeting” : “hello!”,”greeting” : “hello word!”}

ب صاضی ؼػ ب

ثب یىؿطی اظ حسزیز ب اؾشفبز وطز utf-8ثطای ب ساضی ی سا اظ فطز

جبقس (““)ضقش ی ذبی -1

12

(\0جبقس) nullقب وبضاوشط -2

ثبقس ظیطا ای ب ساضی ثطای ؼػ بی ؾیؿشی ضظ .systemجبیس زاضای دیكس -3

قب یظضبی دبیب زاز اؾز. system.users قس اؾز بس

ثبقس $قز جبیس قب وبضاوشط ػ بیی و سؾظ وبضثط سؼطیف یؼ -4

دبیب زاز

ط دبیب زاز زض فبی ػساب . ؼػ ای اظ ؼػ ب سكىی یه دبیب زاز ضا ی زس

ثب زؾشطؾی بی ذبل ذز شذیط ی قز.

لای ب صاضی دبیب زاز

( ثبقس““جبیس قب ضقش سی ) -1

ثبقس nullیب وبضاوشط \ / $ . ( ’‘جبیس زاضای وبضاوشطبی ) -2

ثبیس اظ حطف وچه اؾشفبز قز -3

ثبیز ثبقس 64بوعی ب دبیب زاز ثبیس -4

و ی سای ث آب زؾشطؾی ؿشمی زاقش ثبقی mongoDBزیشبثیؽ بی ضظ قس زض

قب:

Admin

adminیه یظض ث ب ی ثبقس اط authenticationزیشبثیؽ ضیك اؾز و قب

ب ضا ث اضص ی ثطز.authentication اضبف قز ث عض اسبسیه زؾشطؾی ثطا

Local

13

ای دبیب زاز زثبض ؾبذش ی قز ثطای زذیط ؾبظی ط ؼػ ای و ثبیس ضی یه

ثبقس اؾشفبز ی طزز. localؾطض فطز

Config

ب اؾشفبز ی قز. shardشذیط ؾبظی اعالػبر زض ضز shardedزض ؾز

یه فضبی ب ػبؼی ضا سیس ظبی و اؾ دبیب زاز ضا طا ثب اؾ ؼػ ی یؿی

ی زض دبیب زاز blog.postی ب زاضزثطای ظب ؼػ namespaceوی و ی

cms ػز زاضز وcms.blog.post یه فضبی ب ی قز و ای فضبی ب زاضای

ثبیز ثبقس. 100ثبیز حسال 121ع حساوظط

14

mongoDBقطع وبض ثب

15

mongoDBع وبض ثب قط

ضا هت وطز ای ی mongoDBاثشسا اضز ؿیطی و mongoDBثطای وبض ثب دؾش

سب ؾطض زیشبثیؽ قطع ثىبض وس ضا اػطا ی وی mongod زؾشض cmdقی ؾذؽ زض

cmd زیطی ضا ثبظ وطز mongo ث ای ىش سػ ویس و اض ثطای ی یؿی

بیی اؾشفبز ی ctrl cثؿش ؾطض اظ ویس سطویجی

یچ وطز ث یه دبیب ئشه ی قی ثطای ؾ testث نضر دیف فطو ث دبیب زاز

ط اظ زؾشض زاز ی زی

> use tutorial

switched to db tutorial

16

شم قس ای tutorialاؾشفبز ی وی ثطای ظب زض زؾشئط ثبال ث زیشبثیؽ

ای یچ وطز ؾئ tutorialای اؾز و ب ث زیشبثیؽ mongoDBیه اسفبق ػبت زض

ثس ایى آ ضا ایؼبز وی.زض حمیمز یبظی یؿز و ب زیشبثیؽ ضا ایؼبز ضا وی ظیطا

runTimeث نضر documentب زض لغ اضز وطز ای collectionزیشبثیؽ

ؾبذش ی قس

یه ؾس ظ ؾس ظیط ثطای سنیف وبضثط ایؼبز و ب ی ذای ثطای ظب فطو ویس

وی

{username: "ashli"}

زؾشضار ظیط ضا ث سطسیت زجب ی وی

ثطای اضز وطز ای ؾس ذز ث یه ؼػ یبظ زاضی و ثب زؾشض ظیط ای ؼػ

ای ؾس ذز ضا ایؼبز ی وی

> db.users.insert({username: "ashli"})

اط زلز وی دؽ اظ اضز وطز زؾشض اػطای آ یه سبذیط بچیعی ضا احؿبؼ ی وی

فضب زی ث ای ز زض ضی ای سبذیط بقی اظ ظب الظ ثطای ایؼبز زیشبثیؽ ؼػ .

زیؿه ی ثبقس.

ث زضؾشی شذیط قس ؾس غئ ی قی ودؽ اظ زضؾز اضز وطز ؾس ثب زؾشض ظیط

اؾز

> db.users.find()

قش ی ظیط زض ذطػی ظبط ی طزز ,دؽ اظ اػطا

17

{ _id : ObjectId("4bf9bec50e32f82523389314"),

username : "smith" }

ث ؾس ب اضبف ی قز و ای قبؾ حى ویس id_ ذای زیس و یه ,اط زلز وی

یه قبؾ ث ؾس ب ث نضر ,ایؼبز ط ؾس.زض حمیمز زض ظب انی ضا ثطای ب زاضز

.یىشبؾز, قبؾ زض ثی ؾسبی یه ؼػای.ذزوبض اضبف ی طزز

عجك طاح ظیط زاضیذز ؼػ یػسیس ث ؾس ثطای اضبف وطز یه

> db.users.save({username: "jones"})

ػز زاقش ثبقس ؾسحبال ثبیس زض ؼػ ی ب ز

> db.users.count()

2

ثطای كبس ی سب اؾبز ػز زض ؼػ زاضی:

> db.users.find()

{ _id : ObjectId("4bf9bec50e32f82523389314"), username :"ashli" }

{ _id : ObjectId("4bf9bec90e32f82523389315"), username : "jones" }

jonesب وبضثطی ثطاثط چی ثب اؾشفبز اظ زؾشض ؾبز ظیط السا ث اشربة یه ؾس حبی

زض ؼػ ی ضز ظط ی وی

> db.users.find({username: "jones"})

{ _id : ObjectId("4bf9bec90e32f82523389315"), username : "jones" }

ثطظ ضؾبی

یبظ ث ز آضب زاضی. updateزض ی ػیبر

18

آضب ا و ؾس ضز ظط ثطای آدسیز ضا كرم ی وس آضب ز كرم ی وس

چ ؾس ذز ضا ثطظ وی

ضا یع اضبف وی countryضز ashliثطای ظب لهس زاضی ثطای وبضثط

> db.users.update({username: "ashli"}, {$set: {country: "Canada"}})

ضزی ashliزؾشض ظیط ضا اػطا وی .كبس ی قز و ث ؾس حبی ب وبضثطی حب اط

یع اضبف قس اؾز countryثب

> db.users.find({username: "ashli"})

{ "_id" : ObjectId("4bf9ec440e32f82523389316"),

"country" : "Canada", username : "ashli}

ضا حصف وی وبفی ؾز زؾشض ظیط countryظط عی ی حب اط ثرای ثطای وبضثط ضز

:ضا اػطا بیی

> db.users.update({username: " ashli "}, {$unset: {country: 1}})

favoritesثطای ؾبذشبضبی دیچیس سط بس شیط ؾبظی دطفبی یه وبضثط و زاضای یؿشی اظ

اؾز زاضی :

{ username: " ashli ", favorites: { cities: ["Chicago", "Cheyenne"],

movies: ["Casablanca", "For a Few Dollars More", "The Sting"] {

}

ظیط اؾشفبز وطزچی ی سا ثؼبی اظ قش ؾس اظ زؾشض > db.users.update( {username: " ashli "}, { $set: {favorites: {

19

cities: ["Chicago", "Cheyenne"], movies: ["Casablanca", "The Sting"] } } })

ثطاثط moviesثطای ظب قب ی ذایس وبضثطای ضا دیسا ویس و ػالل سی بیف زض

"Casablanca" اؾز.

> db.users.find({"favorites.movies": "Casablanca"})

سض ػؿشؼ ای زؾشض ضا ی زس و ویس ث favorites movies ).( ثی مغ

favorites ضا دیسا و و قب ویس زضی movies اضظـ ؿبی ثبCasablanca قسثب

ثطای ظب بی ثیكشط قب فطو ویس و ثب سػ ث زاف ذز ی زای و طوؿی و

Casablanca ضا زؾز زاضز ث عض حشthe maltese falcon ضا یع زؼ زاضز .ثطای

اؾشفبز وی set$ضا ا ایؿز و اظ ػط ثطظضؾبی زیشبثیؽ ثطای بیف ای الؼیز

زاقش ثبقی .ضا ح ز moviesی ثطای اؾشفبز اظی ػط یبظ ث زثبض یؿی آضای ی

اؾشفبز وی .زضحمیمز ای ز ػط ػهط $push addToSet$ط ایؿز و اظ ز ػ

اضز وطز ػهط سىطاضی ػیطی اظػسیسی ث آضای اضبف ی وس ثب ای سفبر و ػط ز

ی وس.ثب اػطای زؾشض ظیط زاضی:

db.users.update( {"favorites.movies": "Casablanca"}, {$addToSet: {"favorites.movies": "The Maltese Falcon"} }, false, true )

آضب ز زؾشض اضبف وطز ػهط آضب ا قطط ثطای دیسا وطز ؾس ضز ظط اؾز.

وس آضب چبض ای ضا كرم ی ػسیس زض ضز آضب ؾ ثؼسا سضیح ذای زاز

ثبقس. ی multi-updateو ای زؾشض یه

21

صف وطز زازح

زؾشض ظیط ضا اضز ی بیی fooثطای حصف وطز یه ؼػ ثب

> db.foo.remove()

ادط یبظ زاقش ثبقی و ظیطؼػ ی ذبنی اظ یه ؼػ ضا حصف بیی ثب اؾشفبز اظ زؾشض

ظیط السا ث آ حصف آ ؾس یب ظیطؼػ ی بیی

> db.users.remove({"favorites.cities": "Cheyenne"})

ؼػ ضا حصف ی وس ثى سب اؾبز زض removeثبیس سػ زاقش ثبقی و زؾشض

اؾشفبز ی dropبیف اظ زؾشض indexآ دبن ی قس.ثطای حصف وب ؼػ ثب سب

بیی

> db.users.drop()

ضيایؼبز ؼػ بی ثع

ای اؾز و ثغطیك آ ی سا ث یه ؼػ سؼساز ظیبزی اؾبز indexingیه ظب ثطای

ی سا ثب اؾشفبز اظ زؾشض shellث یه ثبض اضبف وطز ظال زض

for(i=0; i<200000; i++) {

db.numbers.save({num: i}); }

اظ فؿط shellث زی ایى ) اضبف وطزی numbersؾس ث ؼػ ی 200000ث سؼساز

javaScript )دكشیجبی ی وس دؽ زؾشض ثبال لبث لج اؾز

شیؼ...

> db.numbers.count()

21

200000

> db.numbers.find()

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac830a"), "num" : 0 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac830b"), "num" : 1 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac830c"), "num" : 2 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac830d"), "num" : 3 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac830e"), "num" : 4 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac830f"), "num" : 5 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8310"), "num" : 6 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8311"), "num" : 7 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8312"), "num" : 8 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8313"), "num" : 9 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8314"), "num" : 10 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8315"), "num" : 11 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8316"), "num" : 12 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8317"), "num" : 13 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8318"), "num" : 14 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8319"), "num" : 15 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac831a"), "num" : 16 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac831b"), "num" : 17 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac831c"), "num" : 18 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac831d"), "num" : 19 }

ثطای زیس ثمی ؼػ وبفیؿز ثیؿی

> it

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac831e"), "num" : 20 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac831f"), "num" : 21 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8320"), "num" : 22 }

...

22

و ث سطسیت ثیبط )ثعضشط اظ( یب )وچىشط اظ( اؾز ی gt $lt$چی ثب اؾشفبز اظ زؾشض

سا دطؼ ػبی ظیط ضا زاقش ثبقی

> db.numbers.find( {num: {"$gt": 199995 }} )

{ "_id" : ObjectId("4bfbf1dedba1aa7c30afcade"), "num" : 199996 }

{ "_id" : ObjectId("4bfbf1dedba1aa7c30afcadf"), "num" : 199997 }

{ "_id" : ObjectId("4bfbf1dedba1aa7c30afcae0"), "num" : 199998 }

{ "_id" : ObjectId("4bfbf1dedba1aa7c30afcae1"), "num" : 199999 }

> db.numbers.find( {num: {"$gt": 20, "$lt": 25 }} )

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac831f"), "num" : 21 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8320"), "num" : 22 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8321"), "num" : 23 }

{ "_id" : ObjectId("4bfbf132dba1aa7c30ac8322"), "num" : 24 }

Explain()

اثشسا ثب یه ظب قطع ی وی ()explainثطای آقبیی ثب

> db.numbers.find( {num: {"$gt": 199995 }} ).explain()

ثبال ضا اػطا بیی كبس ی وی و شبیغ ظیط ث ب ثططزاس ی قزوس اط

{ "cursor" : "BasicCursor",

"nscanned" : 200000,

"nscannedObjects" : 200000,

"n" : 4,

23

"millis" : 171,

"nYields" : 0,

"nChunkSkips" : 0,

"isMultiKey" : false, "indexOnly" : false, "indexBounds" : { } }

ذز ایسوؽ ثصاضی numب ی سای ثب اؾشفبز اظ زؾشض ظیط ثطی ویس

> db.numbers.ensureIndex({num: 1})

ضا ایؼبز numberی زض ؼػ num زؾشض ثبال ایسوؽ صاضی نؼزی ضا ضی ویس

قز و ایسوؽ صاضی اؼب طفش كرم ی ()getindexesثب اؾشفبز اظ زؾشض .وس ی

قس اؾز

> db.numbers.getIndexes() [ {query "name" : "_id_", "ns" : "tutorial.numbers", "key" : {

"_id" : 1

} }, {

"_id" : ObjectId("4bfc646b2f95a56b5581efd3"),

"ns" : "tutorial.numbers", "key" : {

"num" : 1},

"name" : "num_1"}

]

حب اط زؾشض لجی ضا اػطا بیی كبس ی وی و

24

> db.numbers.find({num: {"$gt": 199995 }}).explain()

{

"cursor" : "BtreeCursor num_1",

"indexBounds" : [ [ {

"num" : 199995},

{

"num" : 1.7976931348623157e+308}

] ],

"nscanned" : 5,

"nscannedObjects" : 4,

"n" : 4,

"millis" : 0

}

یی 1یی طبی ث وشط اظ 171كبس ی قز و ثب ایسوؽ صاضی ظب دطؼ ػ اظ

طبی وبف دیسا وطز اؾز.

25

دطؼ ػب

26

ظیط ب عض و اظ لج ی زای ثطای بیف طچیعی و زض یه ؼػ اؾز اظ زؾشض

اؾشفبز ی بیی

> db.c.find()

ضا ثطی طزاس cزؾشض ثبال سب ػبنط ؼػ ی

ثططزاس قز وبفی ؾز ثیؿی age=26 حب اط ثرای ػبنط ثب

> db.users.find({"age" : 27})

ثطای لطاض زاز قطط چسسبیی عجك ظیط ػ ی وی

Condition1 and condition2 and …

> db.users.find({"username" : "joe", "age" : 27})

1ػؿشؼ وبفی ؾز اضظـ ویس ضز ظط ضا حبن اظثطای كرم وطز ویسبی ثطكشی

وی

> db.users.find({}, {"username" : 1, "email" : 1})

{

"_id" : ObjectId("4ba0f0dfd22aa494fd523620"),

"username" : "joe", "email" : "joe@example.com" }

زض نضر اشربة وطز یب اشربة ىطز زض شیؼ ب id_سػ زاقش ثبقیس و اض ویس

ظبط ی قز

ی 0اط ثرای ی ویس ب ثؼع ویس ضزظط ثطكز زاز قس اضظـ ویس ضزظط ضا

وی

> db.users.find({}, {"fatal_weakness" : 0})

27

زض شبیغ ػؿشؼ ػیطی وس id_زؾشض ظیط ی ساس اظ ظبط قس

> db.users.find({}, {"username" : 1, "_id" : 0})

{

"username" : "joe",{

قطط ب

ػجبضار مبیؿ ای قب اضز ظیط اؾز"$lt", "$lte", "$gt", "$gte", <, <=,>, >= > db.users.find({"age" : {"$gte" : 18, "$lte" : 30}})

ؾب ؿشس 30سب 18زؾشض ثبال وبضثطای ضا ثطی طزاس و زاضای ضغ ؾی ثی

ػض قس اس ضا ثطی طزاس 2007/01/01وبضثطای ضا و لج اظ چی زؾشض ظیط و

> start = new Date("01/01/2007")

> db.users.find({"registered" : {"$lt" : start}})

یؿز اظ زؾشضی كبث ظیط )ػ(ثطاثط اضظـ ضزی )ب وبضثطی(ثطای اشربة اؾبزی و اضظقف

اؾشفبز ی وی > db.users.find({"username" : {"$ne" : "joe"}})

ثب ط ع زاز ای ثىبض ثطز ی قز "$ne"

Or queries

و ثطی یه ویس "in$"ػز زاضز ای ضا اؾشفبز اظ orز ضا ثطای اؼب دطؼ ػب ثب

زاقش یىی اظ ثیظ اؼب ی یطز بس ظب ظیط و ثطسب ؿبثم ی ثرز آظبیی ضا زض نر

ضا كرم ی وس 8 5 3بی ثب قبض

> db.raffle.find({"ticket_no" : {"$in" : [3, 5, 8]}})

چی ی سا اظی ػط ثطی ویسی ثب اضظـ بی شع اؾشفبز ز ثطای ظب:

28

> db.users.find({"user_id" : {"$in" : [12345, "joe"]})

ىش(ز ػجبضر ظیط ثطاثطس {ticket_no : {$in : [725]}};; {ticket_no : 725}

ی ثبقس nin$ػط in$مغ ی مبث ػط

> db.raffle.find({"ticket_no" : {"$nin" : [3, 5, 8]}})

اؾز "or$"زض قطط ب اؾشفبز اظ orضا ح ز زض ثىبضیطی

> db.raffle.find({"$or" : [{"ticket_no" : 3}, {"winner" : true}]})

یب > db.raffle.find({"$or" : [{"ticket_no" : {"$in" : [3, 5, 8]}},

{"winner" : true}]}) $not

... 2345789ثطاثط اػساز id_numثطای ظب فطو ویس و ب یبظ ث وبضثطای زاضی و زاضی

... ؿشس ضا ػسا وی ثمی 161116ثطاثط اػساز id_numؿشس زض اثشسا ثبیس وبضثطای ضا و زاضای

ؿشس ثسی ؾب mod[5,1]وبضثطا ضا بیف زی اظ آؼبیی و وبضثطا ػسا قس زاضای قبؾ ی

ػ ی بیی

> db.users.find({"id_num" : {"$not" : {"$mod" : [5, 1]}}})

ىبر(

قطط چسسبیی لبثیز اػطا ضی یه ویس ضا زاضس اب ثطظضؾبی چسسبیی لبثیز اػطا ثطی -1

ضا سغییط ageیه ویس ضا ساضز ثطای ظب زؾشض ظیط بؼشجط اؾز ظیطا عب زثبض ویس

لج اؾززس و غیطلبث ی{"$inc" : {"age" : 1}, "$set" : {age : 40}}

29

ع بی ذبل زض دطؼ ػ ب

سب ای ػب ثب ع بی شػی آقب قس ای و زض اؾبز ثىبض طفش قس اس اب ثؼضی اظی ع ب

زض دطؼ ػب ضفشبض شبیعی زاضس و ثب آب آقب ی قیNull

بآقب ػ ی وس ثطای ظب اط یه ؼػ ثب اؾبز ظیط زاقش ثبقی آبث ػا یه ثیز { "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }

{ "_id" : ObjectId("4ba0f0dfd22aa494fd523622"), "y" : 1 }

{ "_id" : ObjectId("4ba0f148d22aa494fd523623"), "y" : 2 }

دطؼ ػی ظیط ػاة

> db.c.find({"y" : null})

{ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }

اؾز nullثب اضظـ yمساض ؾسی ضا ثطی طزاس و زاضای

null ػال ثط ایى مبزیطnull ضا ثطی طزاس مبزیطی و ػز ساضس ضا یع ثطیطزاس اط

دطؼ ػی ظیط ضا ضی ؼػ ی ثبال اؼب زی زاضی:

> db.c.find({"z" : null})

{ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }

{ "_id" : ObjectId("4ba0f0dfd22aa494fd523622"), "y" : 1 }

{ "_id" : ObjectId("4ba0f148d22aa494fd523623"), "y" : 2 }

اؾز چی ػز زاضز اظ nullحب اط ثرای ویسض ضا ػؿشؼ وی و زاضای مساض

اؾشفبز ی وی "exsist$"ػط

> db.c.find({"z" : {"$in" : [null], "$exists" : true}})

ػجبضار ظ

31

mongoDB اظ وشبثرب یPerl Compatible Regular Expression (PCRE)

اؾشفبز ی وسثطای ثطضؾی ػجبضار ظ

یع ؼبظ اؾز mongoDBؼبظ اؾز زض PCREثبثطای ط ؾیشىؿی و زض

ب ی سای ػجبضار ظ ذز ضا زض دؾش ی ػبا اؾىطیذز اثشسا اشحب وی ؾذؽ زض دطؼ

اظ آب اؾشفبز وی و ای وبض ث ب اعیب ذبعط ضا زضضز زضؾشی ػجبضاسب ی ػبی ذز

زس

ؿشس ضا دیسا وی زض Joeیب joeثطای ظب ب ی ذای ی وبضثطای ضا و زاضای اؾ

ای حبز ی سای اظ یه ػجبضر ظ اؾشفبز وی و ث وچىی یب ثعضی حطف حؿبؼ

بس ظب ظیطیؿز

> db.users.find({"name" : /joe/i}) حب اط ثرای فمظ ب وبضثطای زض ػجبضار ظ ؼبظ اؾز ی یبظ یؿز iاؾشفبز اظ ف

ؿشس ضا دیسا وی وبفی ؾز ػجبضر ظ ضا ث نضر قى ظیط سهحیح joeyضا و كبث

وی> db.users.find({"name" : /joey?/i})

آ ضا اضز دبیب اثشسا چی ی سای ػجبضر ظ ضا ثب ذزـ مبیؿ وی ثسی نضر و

زاز ی وی

31

> db.foo.insert({"bar" : /baz/}) > db.foo.find({"bar" : /baz/}) {

"_id" : ObjectId("4b23c3ca7525f35f94b60a2d"),

"bar" : /baz/ }

آرایه ها

دطؼ ػ ثط ضی آضای ای اظ ػبنط ثؿیبض آؾب ی ثبقس ثسی نضر و ػبنط زض آضای

ثغضی ضفشبض ی وس و ط وسا اضظقی اظ یه ویس وی ؿشس> db.food.insert({"fruit" : ["apple", "banana", "peach"]})

ؿز apple,banana,peachقب آضای ای اظ ی بی fruitزض ای ػب ویس

> db.food.find({"fruit" : "banana"})

شیؼ ی دطؼ ػی ثبال ثطكز ؾس ثبال اؾز

ظیط یؿز زلز زاقش ثبقی و ؾس ثبال ثطاثط ثب ؾس غیطلبی

{"fruit" : "apple‖,"fruit" : "banana", "fruit" : "peach"}

$all

اؾشفبز ی all$ػبنط ثیف اظ یه ػسز ضا ثب مبیؿ وی اظ ػطاط ثرای آضای بیی ثب

بیی

فطو ویس ؼػ ی ظیط ضا زاضی> db.food.insert({"_id" : 1, "fruit" : ["apple", "banana", "peach"]})

> db.food.insert({"_id" : 2, "fruit" : ["apple", "kumquat", "orange"]})

> db.food.insert({"_id" : 3, "fruit" : ["cherry", "banana", "apple"]})

ؿشس apple bananaب ث زجب اؾبزی ؿشی و زاضای ز ػهط > db.food.find({fruit : {$all : ["apple", "banana"]}})

{"_id" : 1, "fruit" : ["apple", "banana", "peach"]}

{"_id" : 3, "fruit" : ["cherry", "banana", "apple"]}

32

آس bananaلج اظ apple بغض و كبس ی قز سطسیت یؿز زض ؾس ا

آس اؾز bananaاؾز ی زض ؾس ز ثؼس اظ

سػ!!!{fruit : {$all : ['apple']} ;;{fruit : 'apple'}.

طزاسز ؾس ثبال ثب ثطاثطس مساض ثطاثطی ضا ثطی

ثبیس زلز زاقش ثبقی و زض دطی ػبیب سؼساز ػبنط آضای ضا ثسضؾشی اضز وی اظ و

ظیبز اضز وطز دطیع وی

> db.food.find({"fruit" : ["apple", "banana", "peach"]})

> db.food.find({"fruit" : ["apple", "banana"]})

> db.food.find({"fruit" : ["banana", "apple", "peach"]})

اط لطاض ثبقس ثطای یه ػهط ذبنی اظ آضای دطؼ ػ ثیؿی اظ ایسوؽ اؾشفبز ی بیی

key.index ثطای ظب اط ثسجب ػهط ؾ اظ آضای ؿشی ی یؿی> db.food.find({"fruit.2" : "peach"})

33

$size

یه قطط وبضثطزی زض اؾشفبز اظ آضای ب قطط ثطی اساظ ی یه آضای اؾز

> db.food.find({"fruit" : {"$size" : 3}})

سطویت وی اب ی سای ثب اضبف "gt$"ب بس condition$ضا ثب زیط size$ی سای

ای وجز ضا ػجطا ویث آضای sizeوطز یه ویس

حس اضبف ی قزایه sizeطب و ب یه ػهط ث آضای اضبف ی وی ث ویس

> db.food.update({"$push" : {"fruit" : "strawberry"}, "$inc" : {"size" : 1}})

حب ی سای دطؼ ػی ظیط ضا اػطا وی

> db.food.find({"size" : {"$gt" : 3}})

$slice operator

ا ضا ثططزای commentسب 10ی ذای blog.postفطو ویس و زض ؼػ ی

اؾشفبز ی بیی slice$ثطای ای وبض اظ ػط

> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : 10}})

ػهط آذط ضا ثططزای زاضی: 10ث ی سطسیت اط ثرای

> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : -10}})

ثطای ثططزاس ػبنط یبی یبظ ث یه آفؿز)مغ ی قطع( سؼساز ػبنط ثطكشی زاضی

34

> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : [23, 10]}})

ضا ثطی طزاس 34سب 24ی یطز اظ ػهط ػهط ا ضا بزیس 23ای زؾشض

ثطای ظب ب ی زض ضز ای ػط ای اؾز و ثمی ی ویسب یع ثططزاس ی قس ىش

ای ی ظیط اؾز ضا ایؼبز وطزو حبی ویسب postsیه ؾس ثب ب

ی ظیط ثطكز زاز قس اؾز ثب اػطای دطؼ ػی شیؼ

زض ذطػی بیف زاز قسس .یع بغض و زیسی ثمی ی ویسب

35

Embedded documentsدطؼ ػ ب زض

ب ز ضـ وی ػز زاضز embedded documentثطای عطح دطؼ ػ اظ

دطؼ ػ ثطی و ؾس یب دطؼ ػ ثطی یه ویس فطز

بس شب ظیط embeddedثطای ظب دطؼ ػ ثطی یه ؾس { "name" : { "first" : "masume", "last" : "ebhami" },

"age" : 22

}

ی ساس ثهضر ظیط ثبقس > db.people.find({"name" : {"first" : "masume", "last" : "ebhami"}})

ضا یع ث ؾس ذز اضبف وس زیط زؾشض middle name ثراس ویس masumeحب اط

یت ویسب یع حؿبؾیز كب ی زسچی ای ع دطؼ ػ ث سطس ثبال ػاة راس زاز

ثبثطای سطسیت ظیط ثطای ثططزاس ؾس ثبال سطسیت زضؾشی یؿز

{"last" : "Schmoe", "first" : "Joe"} ضا ح؟

ضز ظط ی سای كىالر دطؼ ػی لجی ضا ح ویثب اؾشفبز اظ ویس اضظـ

ث ظب ظیط زلز ویس> db.people.find({"name.first" : "masume", "name.last" : "ebhami"})

حب ؼػ ی ظیط ضا زض ظط ثیطیس{ "content" : "...", "comments" : [

} "author" : "joe",

"score" : 3,

36

"comment" : "nice post" }, { "author" : "mary",

"score" : 6,

"comment" : "terrible post" } ] {

ی سا دطؼ ػی ظیط ضا زاقش ثبقی ظیطا ی ویس ب مبیؿ كس اس ویس زضدط ؾ

ػی ظیط یبس اؾز comment

db.blog.find({"comments" : {"author" : "joe", "score" : }"$gte" : 5}}})

ؾسی ضا و ظزسط ی سای دطؼ ػی ظیط ضا زاقش ثبقی ظیطا ای دطؼ ػچی

مساض بیف زاز قس ضا ثطی طزاس

Joe ضا اظ ؾس ز ثط ی طزاس 6 ضا اظ ؾس ا مساض

db.blog.find({"comments.author" : "joe", "comments.score" : {"$gte" : 5}})

ػی زضؾز زض ظیط بیف زاز قس اؾزدطؼ

> db.blog.find({"comments" : {"$elemMatch" : {"author" : "joe","score" : {"$gte" : 5}}}})

ای اىب ضا ی زس و حشیبر زض ؾس ذز ضا ط elemMatch$ اؾشفبز اظ ػط

زض حب مبیؿ embedded documentثسی وی ثطای ظبی و چسی ویس زض

اؾز اؾشفبز ی قز

37

38

Sharding

39

Sharding

Sharding اقبض زاضز ث دطزاظـ اظ عطیك چسثرف وطز اعالػبر شذیط وطز ط ثرف

ای ف یع اؾشفبز ثطای سنیف زض یه بقی ػساب.زض ثؼضی الغ اظ دبضسیك ثسی

قز. ی

ثب ثرف ثرف وطز اعالػبر سیطیز شذیط ؾبظی اعالػبر ثعضي ثس یبظ ث بقی بی

ثعضي لسضسس اىب دصیط اؾز.

Shard وطز ثهضر زؾشی سمطیجب زض ثیكشط زیشبثیؽ ب اؼب ی یطز.ظبی و یه

application دبیب زاز ای ػساب اؾز و ط وسا ث حبی چسی اسهب ث ؾطضبی

عض وب ؿشم اظ ؿشس زض ای حبز ث سیطیز دیچیس ثطای شیط ؾبظی زاز بی

ب ثطی ؾطضبی شفبر چی عطح دطؼ ػب ثطی ؾطض بؾت ثطای

ظیبز زاضز. ثططزاس ػاة یبظ زاضی اجش ای قی اػطایی اؾز اب زضزؾط

mongoDB اظ عیزshard و ثؿیبضی اظ زضزؾطبی وطز ثهضر اسبسیه ثط زاض اؾز

shard وطز ضا اظ ثی ثطز اؾز AutoSharding

ث ای ؼی اؾز و ؼػ ب ث سى بی وچىشط ثب mongoزض shardingف

chunks سمؿی ی قس

ؿؤ یه ظیط ثركی اظ shardب درف ی قس و ط shardب زض ؾطاؾط chunkای

ب زاضز ػیبر mongosثبثطای ثب اؾشفبز اظ یه دطزاظـ ؿیطیبثی و و زیشبب اؾز

sharding اؼب ی یطز

ث آ ن ی applicationؿیطیبة ىب ی زاز ب ضا ی زاس ثبثطای ظبی یه

mongoDBث یه زیشبثیؽ ؼی بیف ضا بس زضذاؾز بی قز ی ساس زضذاؾز

ثسس

41

اؾشفبز كس اؾز وبضثط ث shardingثب سػ ث ز قى ظیط زض یبثی و زض قى ا اظ

shardingػ mongosعض ؿشمی ث زیشبثیؽ ن اؾز اب زض قى ز ثب اؾشفبز اظ

وبضثط ثب sharding اؼب طفش اؾز و ؾیؿش زض و عضی ضفشبض ی وس و قجی ثس

دبیب زاز سؼب زاضز

41

وطز اؾشفبز ی وی؟ shardوی اظ

ظبی و فضبی زیؿه ثطی بقی فؼی و ثیبز-1

زاز ب زاضی ظبی و یبظ ث قش ؾطیغ-2

یه لؿز ثعضی اظ زاز بضا زض حبفظ ساضی وی ظبی و ی ذای-3

اؾشفبز shardingضا ىی ثؼسا زض نضر یبظ اظ shadingزض حمیمز ب ی سای اثشسا

وی

Shard وطز

وطز اثشسا یه ویس اظ ؼػ اشربة ی وی و ثطحؿت آ ویس زاز ب ضا shardثطای

ب زاضز shad keyػسا ی وی ای ویس

ثب یه ظب ثیكشط ث ای ضع ی دطزاظی:

ضا ساضی ی وس اقربل فطو ویس و یه ؼػ حبی اؾبز زاضی و اعالػبر

ی س اؾبی ض shardزض ای نضر یه ب ثط اؾبؼ ب اقربل ثبقس shard keyاط

آذطی G-P shardاؾبی ض و ثب shardقطع یك ضئ ساضی و یه A-Fو ثب

قطع یك ض ساضی ثى Q-Z قب اؾبی و ثب

بض ساضی ی وس ب ی ذای و آ ضا logفطو ویس و یه ؼػ زاضی و

shard وی اط ب ػshardign ضا اػطا وی ثmongoDB ثیی و اظ

timestamp ث ػاshard key اؾشفبز وس زضا حب ب فمظ یهshard ضی

احس ی ضس shardی زاز بیب زاضی ثب اضز وطز زاز ب ی آب ث یه

و زیط اضبف وی زض ای حبز ؼػ ث ز لؿز سمؿی ذاس قس shardچبچ یه

chunks ب زاضز و یهchunk حبی اؾبزی اؾز و زض ضغ اضظـshard key ؿشس

یه june 26 2010 سب -∞ثی timestampحبی اؾبز زض ضغ chunkظال زض یه

chunk حبی اؾبزjune 27 2010 اؾز∞سب +

Sharding چ سبطیطی ضی ػیبر زاضز؟

42

قس یه shardی ؼػ ی سای سفبسی ثی یه end userث ػا یه

كس ثجیی shardی ؼػ

و ؾ سب قس اؾز shardفطو ویس و ؼػ اقربل ضا زاضی و ثطحؿت اؾ

shard زض ضغA سبZ و زض ایهضر دطؼ ػبی شفبر ث ضـ بی شفبر زاضی

اػطا ذاس قس

db.people.find({"name" : "Susan"}) mongos ض ؿشمی ث عای دطؼ ػ ضا ثshard حبی اؾبی قطع قس ثبQ-Z

ذاس فطؾشبز ػاة ضا ث وبضثط ثط ی طزاسdb.people.find({"name" : {"$lt" : "L"}})

طاػؼ ی قز A-F G-Pبی shardزض ایهضر ث db.people.find().sort({"email" : 1})

mongos دطؼ ػ ضا ث یshard ب ی فطؾشس ؾذؽ شبیغ ضا ثب طست ؾبظی

ازغبی ی وس ث ػا یه شیؼ ی احس ثط ی طزاس

db.people.find({"email" : "joe@example.com"}) ب فطؾشبز ی قز سب chunkزض ایهضر ای دطؼ ػ ث نضر دكز ؾط ث ی

شیؼ ثططزاس قز

shrdingػیبر

ػز زاضز shardز طح ثطای ػیبر

Sharding زض اؾبؼ قب ؾ ػعء اؾز زض اضسجبط ثب ػ ی وس Shard

چی یه یه حفظ ای و ظیطؼػ بیی اظ زاز بی یه ؼػ ضا ساضی ی وس

چسی ؾطض ػز shardاط زض یه اؾزیب یه ؼػ ی اظی mongodؾطض

زاقش ثبقس ثبظ یه ؾطض انی اؾز ؾطضبی زیط یع قب ب زاز ب ؿشسMongos

ػز زاضز و زض ان یه mongoیه دطزاظـ ؿیطیبثی اؾز و زض ی سظیغ بی

زضذاؾز ؿیطیبثی ػاة بی ػؼی اؾزConfig server

43

یچ mongosاؾز.چ shrd.وسا زاز زض وسا وسدیىطثسی والؾشطب ضا شذیط ی

ب ضا shardث ىبی یبظ زاضی و دیىطثسی ضا ثغض یكی شذیط ی وسچیعی

ساضی وس

یىی ظیطا Configضا اؼب ثسی زض اثشسا ؾطض ضا mongosزض اثشسا ثبیس دیىطثسی ؾطض

ث آ یبظ زاضی mongosثطای

قطع ی وی mongodؾطض لج اظ ی ػیبر اظ لجی Configثطای $ mkdir -p ~/dbs/config

$ ./mongod --dbpath ~/dbs/config --port 20000

ب ثبیز 200وی ثبیز زض ط 1و ا دیىطثسی ث فضب یب بثغ ظیبزی یبظ ساضز)فضبیی حسز

اظ اعالػبر الؼی(

و ای ػیبر یبظ زاضی و ػیبر ؿیطیبثی زض اسهبالر ضا اؼب زس mongosحب ث

وؼبؾز Config serverؿیطیبثی یبظ زضاز و ثساس $ ./mongos --port 30000 --configdb localhost:20000

shardاضبف وطز یه

اؾز mongodیه اظ shardزض حمیمز $ mkdir -p ~/dbs/shard1

$ ./mongod --dbpath ~/dbs/shard1 --port 10000

ذز ضا ث والؾشطب اضبف وی shardشه قس ای ی سای mongosحب ب ث

شه قس ای: mongosثطای اعیب اظیى ث $ ./mongo localhost:30000/admin

MongoDB shell version: 1.6.0

url: localhost:30000/admin

connecting to localhost:30000/admin

44

type "help" for help

زاضی : shardثطای اضبف وطز

> db.runCommand({addshard : "localhost:10000", allowLocal : true})

{

"added" : "localhost:10000",

"ok" : true }

localhostب ضی shardای ضطضر ضا زاضز و ثیب ی وس فمظ allowLocalویس

اؾز

Sharding Data

id shard_ ثط حؿت ویس fooضا زض زیشبثیؽ barفطو ویس و ی ذای ؼػ ی

فؼب ی وی fooضا ثطای زیشبثیؽ shardingزضاثشسا وی

> db.runCommand({"enablesharding" : "foo"})

Shard وطز زیشبثیؽ ؼػ ب ضا زضshard بی رشف شذیط ی وس و ثطای

shard .وطز یه ؼػ ای ػ دیكیبظ اؾز

ؼػ ضا shardcollectionث یىجبض ی سای اظ اثشسا یه ؼػ ضا ثؾی ی زؾشض

shard وی > db.runCommand({"shardcollection" : "foo.bar", "key" : {"_id" : 1}})

ذزوبض زاز .حب اط زاز اضبف وی ثهضر وطز ای id shard_حب ب ؼػ ضا ثطحؿت

بی طثع لطاض ی یطز shardزض id_ب ثب سػ ث

45

Aggregation

46

mongoDB اثعاضبی ظیبزی ضا ثطایaggregation فطا ؾبذش اؾز اظ قبضـ ؾبز

mapreduceاؾبز زض یه ؼػ طفش سب آبیع زاز بی دیچیس ثب اؾشفبز اظ

Count

و سؼساز اؾبز زض یه ؼػ ضا ثطی طزاس aggregationؾبز سطی اثعاض > db.foo.count()

0

> db.foo.insert({"x" : 1})

> db.foo.count()

1

ػی ضغ ؾبیع یه ؼػ ػیبر قبضـ ثب ؾطػز ظیبزی اؼب ی یطز

ثسی سب شیؼ ضا ثططزاس countچی ی سای یه دطؼ ػ ث

> db.foo.insert({"x" : 2})

> db.foo.count()

1

> db.foo.count({"x" : 1})

1

Distinct

و ثبیس یه ؼػ زاز قس ضا ثطی طزاس ای زؾشض ی مساض بی شفبر ثطای ویس

بس ظب ظیط: یه ویس ث ػا ضزی ث ای زؾشض زاز قز> db.runCommand({"distinct" : "people", "key" : "age"})

فطو ویس ؼػ ی ظیط ضا ثب اؾبز زاز قس زاضی{"name" : "Ada", "age" : 23}

47

{"name" : "ashli", "age" : 30}

{"name" : "john", "age" : 25}

{"name" : "Andy", "age" : 30}

حب شیؼ ی زؾشض ثبال ثطی ای ؼػ ث لطاض ظیط اؾز

> db.runCommand({"distinct" : "people", "key" : "age"})

{"values" : [20, 35, 60], "ok" : 1}

Group

groupقجی mongoزض groupبیی زاق ثبقیس ثبیس ثی و آق sqlاط ثب ظثب بی

by زضsql اؾز.

Group ای اػبظ ضا ی زس و ؼػ ی ذز ضا ث ظیططبی ػساب ثطحؿت مساض

ویس اشربثی سمؿی ثسی وی

نجح 10 ثطای ظب فطو ویس و ب ؾبیشی زاضی و ػزی ضا ط چس زلیم یىجبض اظ ؾبػز

ػهط طجز ی وس اض آذطی ػزی ضا ساضی ی وس 4سب

ضظ لج ضا كبس وی ثب ط ثسی وبض ب 30ػزی زض آذطی حب اط ثرای مساض

آؾب سط ی قز {"day" : "2010/10/03", "time" : "10/3/2010 03:57:01 GMT-400", "price" : 4.23}

{"day" : "2010/10/04", "time" : "10/4/2010 11:28:39 GMT-400", "price" : 4.27}

{"day" : "2010/10/03", "time" : "10/3/2010 05:00:23 GMT-400", "price" : 4.10}

{"day" : "2010/10/06", "time" : "10/6/2010 05:27:58 GMT-400", "price" : 4.30}

{"day" : "2010/10/04", "time" : "10/4/2010 08:34:50 GMT-400", "price" : 4.01}

بس ظیط ب ی ذای یؿز آذطی ػزی ط ضظ ضا كبس وی[

{"time" : "10/3/2010 05:00:23 GMT-400", "price" : 4.10},

{"time" : "10/4/2010 11:28:39 GMT-400", "price" : 4.27},

{"time" : "10/6/2010 05:27:58 GMT-400", "price" : 4.30}

]

ثطای ای وبض وبفی ؾز و ؼػ ی ذز ضا ثطحؿت ضظ ط ثسی وی زض ط ط آذطی

ؾس ضا دیسا وی

> db.runCommand({"group" : {

48

... "ns" : "stocks",

... "key" : "day",

... "initial" : {"time" : 0},

... "$reduce" : function(doc, prev) {

... if (doc.time > prev.time) {

... prev.price = doc.price;

... prev.time = doc.time;

... }

... }}}) حب ث ثطضؾی ثرف بی ای زؾشض ی دطزاظی

"ns" : "stocks", ؼػ ی ضز ظط ثطای ط ثسی ضا كرم ی وس

―key‖:‖day‖ لغؼب لطاض اؾز ثطحؿت آ ط ثسی اؼب یطز ضا كرم ی وس.ویسی و

ؿشس زض یه ط لطاض ذاس طفززض ای ظب اؾبزض و زاضای ضظ یىؿب

"initial" : {"time" : 0}

"$reduce" : function(doc, prev) { ... } ای سبثغ ثطای ط ؾس زض ؼػ یىجبض فطاذای ی قز و ؾس ػبضی ضا ی یطز یه

اجبق ثطای اؾبز اؾز و زض ای ظب ب سبضید ؾس ػبضی ضا ثب سبضید اجبق مبیؿ ی وی

و زض نضر آذطی ؾس ثز ظب ػزی ضا زض اجبق شذیط ی وی .سػ زاقش ثبقیس

ط یه اجبق ػساب ذای زاقزثطای ط

ضظ سقش ثبقس دؽ یبظ ث قطعی زاضی و 30زض اثشسا فشی و ی ذای شبیغ طثط ث

ای كى ضا ح وس

> db.runCommand({"group" : { ... "ns" : "stocks", ... "key" : "day",

... "initial" : {"time" : 0},

... "$reduce" : function(doc, prev) {

49

... if (doc.time > prev.time) {

... prev.price = doc.price;

... prev.time = doc.time;

... }},

... "condition" : {"day" : {"$gt" : "2010/09/30"}}

... }})

ط ط قب ویسی ضظ ضا ی آضز و ط وسا یه ط ؿشس 30زؾشض ثبال آضای ای اظ

prev مساض (day‖ : string―اؾز و ثطحؿت آ ط ثسی قس اؾز ظال زض ای ظب )

ط ثسی ی day:nullجبقس زض یه ط ثب ػهط dayبیی.اط ثؼضی اؾبز قب ویس

زض لؿز ضا day" : {"$exists" : true}" طای حصف ای ط ب وبفی ؾز و و ث قس

قطط ثیؿی

سؼساز اؾبز اؾشفبز قس سؼساز مساضبی شفبر ثطای ویس ضا ثط ی groupو زؾشض

طزاس> db.runCommand({"group" : {...}}) { "retval" : [ {

"day" : "2010/10/04",

"time" : "Mon Oct 04 2010 11:28:39 GMT-0400 (EST)"

"price" : 4.27

}, ... ],

"count" : 734,

"keys" : 30,

"ok" : 1

}

اؾشفبز ی Finalizerچبچ ثرای شیؼ ثبظكشی ثهضسی و ذزب ی ذای ثبقس اظ

بییFinalizer

51

Finalizer ثطای و وطز حؼ اعالػبر ذطػی اظ ؾز زیشب ثیؽ ث ؾز وبضثط اؾشفبز ی

ی اؾز ظیطا ثطای ذطػی ط ثسی یبظ ث یه لبجی قس و ای یه یػی ذیی

بؾجی اظ ػاة زیشبثیؽ زاضی

ثطای كب زاز ای اط ثب یه ظب قطع ی وی

زض ای ظب ب ثالی زاضی و زاضای دؿز بیی ثب س بی شفبر اؾز حب ی ذای

هضر یبظ زاضی و ط ثسی ثط حؿت ضظ حجة سطی س زض ط ضظ ضا كبس بیی زض ای

زاقش ثبقی و مساض س ب ضا ساضی وس> db.posts.group({ ... "key" : {"tags" : true}, ... "initial" : {"tags" : {}}, ... "$reduce" : function(doc, prev) { ... for (i in doc.tags) { ... if (doc.tags[i] in prev.tags) { ... prev.tags[doc.tags[i]]++; ... } else {

... prev.tags[doc.tags[i]] = 1;

... }

... }

... }}) و شیؼ ای قجی ظیط ضا ثط ی طزاس

[

{"day" : "2010/01/12", "tags" : {"nosql" : 4, "winter" : 10, "sledding" : 2}},

{"day" : "2010/01/13", "tags" : {"soda" : 5, "php" : 2}},

{"day" : "2010/01/14", "tags" : {"python" : 6, "winter" : 4, "nosql": 15}}

] اب فطؾشبز ی س ب ث یسا ی ویاض ثعضشطی س ضا زض ؾز وبضثط دؾذؽ ب مس

چبض چیؿز؟ ؾطثبض ظیبزی اؾز ؾز وبضثط زاضای

اػطا ی لج اظ فطؾشبز قس ث ؾز وبضثط زضای سبثؼی اؾز و ضی ط ط finalizerیه

و زض ای حبز ذطػی ب طست ثس یچ اضبفبسی اؾز قز> db.runCommand({"group" : { ... "ns" : "posts", ... "key" : {"tags" : true}, ... "initial" : {"tags" : {}},

51

... "$reduce" : function(doc, prev) {

... for (i in doc.tags) {

... if (doc.tags[i] in prev.tags) {

... prev.tags[doc.tags[i]]++;

... } else {

... prev.tags[doc.tags[i]] = 1;

... }

... },

... "finalize" : function(prev) {

... var mostPopular = 0;

... for (i in prev.tags) {

... if (prev.tags[i] > mostPopular) {

... prev.tag = i;

... mostPopular = prev.tags[i];

... }

... }

... delete prev.tags

... }}})

حب فمظ شبیؼی ثطؿز زاز ی قز و ظز یبظ ب اؾز[

{"day" : "2010/01/12", "tag" : "winter"},

{"day" : "2010/01/13", "tag" : "soda"},

{"day" : "2010/01/14", "tag" : "nosql"}

]

اؾشفبز اظ سبثغ ث ػا ویس

زض ط ثسی ی سای ثؼبی ایى اظ یه ویس ث ػا ؼیبضی ثطای ط ثسی اؾشفبز وی

keyاظ سبثغ بی زرای ثطای ط ثسی اؾشفبز وی زض ای حبز فمظ وبفی ؾز ثؼبی

ضا ثیؿی بس زؾشض ظیط keyfو ی

> db.posts.group({"ns" : "posts", ... "$keyf" : function(x) { return x.category.toLowerCase(); }, ... "initializer" : ... })

52

MapReduce countاؾز و ثیكشط اظ ط وبضی ضا و ی سای ثب aggregationیىی اظ اثعاضبی

group distinct اؼب ثسی ثبmapreduce یع اؼب ثسی

ی قز ػیبر اظی ؾبظی ثطی چسی بقی یع aggregationچی ثب ای ضـ

اؼب ثیطز

و زض ای نضر ؿب ث چس لؿز سمؿی ی قز ط لؿز زض یه بقی ػساب

زض ط بقی ػاة ب ثب ازغب ی قس ث ػا ؿب ح ی قز دؽ اظ اسب وبض

یه ػاة بیی ثبظؿز زاز ی قز

و ای اثعاض قب ز ب اؾز

ب یه ػیبسی زض ط ؾس اؼب ی زس و ای mapب زاضز و mapب ا: ب

ضا ثططزاس xػیبر ی ساس وبضی ضا اؼب سس یب مساضی بس

53

Indexing

54

55

ایسوؽ صاضی زض زی ثی

ثطای ػؿش زض یه وبىك اظ زیشبثیؽ ذزب زؾشض مبث ضا ی یؿی ظال:

Db.users.find({name:’ada’})

ای ػ ظبجط اؾز ظیطا سب ثب زؾشض ثبال یظض آزا ضا زض ثی وبىك یظض ػؿشؼ ی وی

اؾبز زاذ وبىك یظض ضا ػؿشؼ ی وس

كى؟

ظبجط ثز ای ػ ػؿشؼ ثی جز ای وبض فی ثب ایسوؽ صاضی ضا ثػز آضز

56

ثب اؾشفبز اظ ای ضـ ػ ػؿشؼی ثی ای ضا ثطای دیسا وطز یه ضز ذبل ثط دبی ی

ی اؼب ی زیایسوؽ صاض

ث شب ظیط سػ فطبییس

> db.users.find({name: "user101"}).explain()

{ "cursor" : "BasicCursor",

"nscanned" : 1000000,

"nscannedObjects" : 1000000,

"n" : 1,

"millis" : 721,

"nYields" : 0,

"nChunkSkips" : 0,

"isMultiKey" : false, "indexOnly" : false, "indexBounds" : { } }

اعالػبر طثط ث ای ()explainای یه ػ ػؿشؼی ؾبز اؾز و ثب اؾشفبز اظ شس

اؾز falseػؿشؼ ضا ثسؾز آضز ای بغض و ی ثییس زض ای ضـ مساض ایسوؽ ثطاثط

Db.users.ensureIndex({―name‖:1})

كب 1اؼب زاز ای ػؼسز nameض ثبال ػ ایسوؽ صاضی ضا ثطی ثب اؾشفبز اظ زؾش

كب زس ی عی ثز آ اؾز 1-زس ی ایسوؽ صاضی ثط حؿت نؼزی اؾز ػسز

ثبض زیط ػ ػؿشؼ ضا اؼب ی زی

> db.users.find({"username" : "user101"}).explain()

57

{

"cursor" : "BtreeCursor username_1",

"nscanned" : 1,

"nscannedObjects" : 1,

"n" : 1,

"millis" : 3,

"nYields" : 0,

"nChunkSkips" : 0,

"isMultiKey" : false, "indexOnly" : false, "indexBounds" : { "username" : [ [

"user101",

"user101"

] ] } {

ثطاثط یه اؾز یؼی فمظ یه ضز scanاؾز مساض trueزض ای ثبض مساض ایسوؽ ثطاثط

ثطضؾی قس اؾز یبظی ث ػؿشؼی سب اؾبز زاذ وبىك یظض جز اؾز

زض حمیمز ایسوؽ سب اؾبز زاذ وبىك ضا ثط اؾبؼ دبضاشط ایسوؽ قس طست ی وس

ػ طست ؾبظی اثشسا ثطاؾبؼ ؾ ؾذؽ ثطاؾبؼ ب اؼب ی یطزثطای ظب زض زؾشض ظیط

> db.users.find().sort({"age" : 1, "name" : 1})

اب ثطای ثجز ای ػ ی سای یه ایسوؽ صاضی ث نضر ظیط ضا زاقش ثبقی

> db.users.ensureIndex({"age" : 1, "username" : 1})

فش ی قز compound indexث ای ضـ ایسوؽ صاضی آضای ب

58

زض ای ع اظ ایسوؽ ساضی ی سای اؾبز سزضس ضا یع ایسوؽ صاضی وی ظال:{ "username" : "ada", "loc" : {

"ip" : "1.2.3.4",

"city" : "tbz", "state" : "sh" } }

cityزاضای ؾ فیس زیط اؾز اط ثرای ػ ایسوؽ ضا ثطی locبغض و ی ثییس

اؼب ثسی زاضی:

> db.users.ensureIndex({"loc.city" : 1})

زاضز ثطای ظب ظبی و usernameاب سفبر بیی ثب ایسوؽ صاضی فیس بیی بس

loc.city ضا ایسوؽ ی وی ثطای قش دطؼ ػیی بس

db.users.find({"loc" : {"ip" : "123.456.789.000", "city" :

"Shelbyville","state" : "NY"}}})) ثبیس ی فیس بی ظیط ؾس ضا ث سطسیت زضؾز اضز وی ؼبظ ث قش دطؼ ػیی

بس ظیط یؿشی

db.users.find({"loc.city" : "Shelbyville"}).

Unique index

سوؽ صاضی یه ایسوؽ صاضی یىشب اؾز و ثطاؾبؼ آ فیس ػبضی اظ دصیطفش ای ای

مساضبی ؿب ػیطی ی وس

> db.users.ensureIndex({"username" : 1}, {"unique" : true})

ثطای ظب زضع زؾشض ز ثب ذغب اػ اؾز

59

> db.users.insert({username: "bob"}) > db.users.insert({username: "bob"})

E11000 duplicate key error index: test.users.$username_1 dup

key: { : "bob" }

اظ ثی ثطز ایسوؽ ضز ظط

ثب اؾشفبز اظ زؾشض ظیط ی سا یه ایسوؽ ضا زض ؼػ اظ ثی ثطز

> db.people.dropIndex("ب ایسوؽ")

{ "nIndexesWas" : 3, "ok" : 1 }

Sparse index

ا ثبیس ث ای ف ثب زیشبثیؽ بی ضاثغ ای وبال شفبر اؾز یؼی ثب ای ایسوؽ صاضی

یه ایسوؽ صاضی ؼی اؾز و یبظی یؿز فیس زض ی اؾبز ػز زاقش ثبق

ثطای ظب: سو یىشب ثبق زیبظی یؿ

> db.ensureIndex({"email" : 1}, {"unique" : true, "sparse" : true})

حب ث ظب ظیط سػ ویس

ؼػ ظیط زاضای اؾبز ظیط اؾز

> db.foo.find()

{ "_id" : 0 }

{ "_id" : 1, "x" : 1 }

{ "_id" : 2, "x" : 2 }

{ "_id" : 3, "x" : 3 }

حب شیؼ زؾشض ظیط ثس ایسوؽ صاضی :

61

> db.foo.find({"x" : {"$ne" : 2}})

{ "_id" : 0 }

{ "_id" : 1, "x" : 1 }

{ "_id" : 3, "x" : 3 }

ضا اؼب ثسی شیؼ ظیط اؾز! sparseایسوؽ صاضی xاط ایجبض ضی

> db.foo.find({"x" : {"$ne" : 2}})

{ "_id" : 1, "x" : 1 }

{ "_id" : 3, "x" : 3 }

زض ؾس ا جز اؾز ای ؾس قب ایسوؽ صاضی كس زض xزض شیؼ ثبال ث زی ایى

ػاة شیؼ ی ػؿشؼ یبس اؾز دؽ ث ای ىش سػ زاقش ثبقیس

وؽ صاضی ثی ضی دطؼ ػبیب زاقش ثبقی یبظ ث سایى سؼیی وی چ یه ای

اب ثبػض افعایف وبضایی ی قز ر ثبال زاضزضب

ثطفطو ب یه دطؼ ػی ؾبز ثطی یه ویس زاضی

> db.people.find({"username" : "mark"})

ظبی و یه ویس زض دطؼ ػ اؾشفبز ی قز ثب ایسوؽ ساضی ؾطػز دطؼ ػ ضا ثبال

ایؼبز وی ثطای ای وبض اظ usernameزض ای ظب ی ذای یه ایسوؽ ثطی .ی ثطی

اؾشفبز ی بیی ensureIndexشس > db.people.ensureIndex({"username" : 1})

یه ایسوؽ فمظ ثطای یىجبض ضی ط ؼػ ایؼبز ی قز.اط ثرای ب ایسوؽ ضا ثطای

ثبض زیط ایؼبز وی یچ اسفبلی ی افشس

یؼشط اػطا قزایسوؽ ضی یه ویس ثبػض ی قز و دطؼ ػب ثطی آ ویس ؾط

حشی اط قب ویس ایسوؽ قس ثبقساب دطؼ ػبی زیط ضا ؾطیغ ی وس

ثطای ظب ثب ایسوؽ صاضی ػبضی ثطی دطؼ ػی ظیط سبطیطی ضخ ی زس> db.people.find({"date" : date1}).sort({"date" : 1, "username" : 1})

61

ثبیس ایسوؽ صاضی ویس بی اؾشفبز قس زض دطؼ ػیه لب وی ای اؾز و ی

ایسوؽ صاضی date username قس ثطای ظب ثبیس زض دطؼ ػی ثبال طز ویس

قس

> db.ensureIndex({"date" : 1, "username" : 1})

صاضی ویادط ثیكشط اظ یه ویس زاقش ثبقی زض آهضر ثبیس اشربة زضؾشی ثطای ایسوؽ

ثطای ظب ؼػ ی ظیط ضا زاضی { "_id" : ..., "username" : "smith", "age" : 48, "user_id" : 0 }

{ "_id" : ..., "username" : "smith", "age" : 30, "user_id" : 1 }

{ "_id" : ..., "username" : "john", "age" : 36, "user_id" : 2 }

{ "_id" : ..., "username" : "john", "age" : 18, "user_id" : 3 }

{ "_id" : ..., "username" : "joe", "age" : 36, "user_id" : 4 }

{ "_id" : ..., "username" : "john", "age" : 7, "user_id" : 5 }

{ "_id" : ..., "username" : "simon", "age" : 3, "user_id" : 6 }

{ "_id" : ..., "username" : "joe", "age" : 27, "user_id" : 7 }

{ "_id" : ..., "username" : "jacob", "age" : 17, "user_id" : 8 }

{ "_id" : ..., "username" : "sally", "age" : 52, "user_id" : 9 }

{ "_id" : ..., "username" : "simon", "age" : 59, "user_id" : 10 }

ایسوؽ صاضی وی و .{username" : 1, "age" : -1"}حب ی ذای ثط حؿت

شبیغ ظیط ثطكز زاز ی قز

{ "_id" : ..., "username" : "jacob", "age" : 17, "user_id" : 8 }

{ "_id" : ..., "username" : "joe", "age" : 36, "user_id" : 4 }

66 | Chapter 5: Indexing

{ "_id" : ..., "username" : "joe", "age" : 27, "user_id" : 7 }

{ "_id" : ..., "username" : "john", "age" : 36, "user_id" : 2 }

{ "_id" : ..., "username" : "john", "age" : 18, "user_id" : 3 }

{ "_id" : ..., "username" : "john", "age" : 7, "user_id" : 5 }

{ "_id" : ..., "username" : "sally", "age" : 52, "user_id" : 9 }

{ "_id" : ..., "username" : "simon", "age" : 59, "user_id" : 10 }

62

{ "_id" : ..., "username" : "simon", "age" : 3, "user_id" : 6 }

{ "_id" : ..., "username" : "smith", "age" : 48, "user_id" : 0 }

{ "_id" : ..., "username" : "smith", "age" : 30, "user_id" : 1 }

بغض و زیس ی قز ب وبضثطی ثطحؿت افعایف حطف افجب ث سطسیت لطاض ی یطز زض

اؾ بی ثطاثط ؾ ثطحؿت وبف ؾ طست قس اس

چی ثبػض سؿطیغ دطؼ ػب ضی age usernameایسوؽ صاضی ثطی

username ث عض وی اط ایسوؽ ب ضی زاضزn ویس ثبقس زض ایهضر دطؼ ػب

ظال اط ایسوؿی ثب ویسبی ثطی ط یه اظ دیكسبی ای ویسب ؾطیغ اؾز

{"a" : 1, "b" : 1, "c" : 1, ..., "z" : 1} ویس بی ظیط ضا زاقش ثبقی ط ویسی بس

: "b"}ی ثطی {a" : 1, "b" : 1, "c" :1"} ,{a" : 1, "b" : 1"} ,{a" : 1"}ایسوؽ ی قس

1}, {"a" : 1, "c" :1}, وبضثطزی ساضز ثبثطای ویس ثبیس دیكسبیی اظ ایسوؽ ب ثبقس

63

MongoDسیطیز زض

64

دكشیجب یطی اظ زیشبثیؽ ذز اؾز ثطای ای وبض ثب یه ظب ای وبض ثطای یه سیط زیشبثیؽ

قسی ؾطضی اؾز و دبیب ؾطضی و ث آ اضز ؾبز قطع ی وی ثب دیف فطو بی ظیط

دكشیجب زض زایطوشضی ػبضی قب فضبی وبفی ثطای دكشیجب یطی ضا زاضی ضـ اؾز زاز ب

ب ساضی permissionبز ی قز زضیطی ثب ایؼ

اثشسا یه فبی ثطای لطاض زاز دكشیجب ذز ایؼبز ی وی حب قطع ثىبض ی وی$> mkdir testmongobackup $> cd testmongobackup $> mongodump

اط شیؼ ای كبث ظیط ث زؾز آضزیس دؽ وبضس زضؾش!$ mongodump

connected to: 127.0.0.1

Tue May 21 20:52:58.639 all dbs

Tue May 21 20:52:58.640 DATABASE: blog to dump/blog

Tue May 21 20:52:58.640 blog.system.indexes to

dump/blog/system.indexes.bson

Tue May 21 20:52:58.641 4 objects

Tue May 21 20:52:58.641 blog.system.profile to

dump/blog/system.profile.bson

Tue May 21 20:52:58.645 3688 objects

Tue May 21 20:52:58.645 Metadata for blog.system.profile to

dump/blog/system.profile.metadata. json

Tue May 21 20:52:58.645 blog.authors to dump/blog/authors.bson

Tue May 21 20:52:58.646 1 objects

Tue May 21 20:52:58.646 Metadata for blog.authors to

dump/blog/authors.metadata.json

65

Tue May 21 20:52:58.646 blog.posts to dump/blog/posts.bson

Tue May 21 20:52:58.686 29997 objects

Tue May 21 20:52:58.709 Metadata for blog.posts to

dump/blog/posts.metadata.json

Tue May 21 20:52:58.710 blog.tagcloud to dump/blog/tagcloud.bson

Tue May 21 20:52:58.710 1 objects

Tue May 21 20:52:58.710 Metadata for blog.tagcloud to

dump/blog/tagcloud.metadata.json ب فمظ ثرای اظ زیشبثیؽ ذز ثه آح ثیطی اط ضی ؾطض چسی زیشبثیؽ ػز ثبقس

اث وبض ضا اؼب ی زی و زض ایهضر d database_name-زض ایهضر ثب زؾشض mongodump یه فسض./dump ایؼبز ی وس و حبی ثه آح زیشبثیؽ ب اؾز

اط ثرای فمظ اظ یه وبىك ثه آح ثیطی زض ایهضر زاضی$mkdir ~/backuptemp $cd ~/backuptemp $mongodump -d blog -c posts $mongodump -d blog -c tagcloud

اعالع ی زی ثطای ظب ثبال اظ وبىف mongodumpوبىك ضا ث c–و یب اؾشفبز اظ

ثه آح طفش قس اؾز و زض فسض blogزض زیشبثیؽ post tagcloudبی

backuptemp قس اؾزلطاض زاز

ثطای اعالػبر ثیكشط زض ضز ثه آح یطی وبفی اؾز وس ظیط ضا ثیؿی حشیبر ض ثطضؾی

ویسMongodump –help

66

برگرداندن داده ها با استفاده از بک آپ ها

اؾشفبز ی وی mongorestoreثطای ثبظطزاس اعالػبر اظ

حب ی بی ث ای عی ثیساظی

67

68

ز عی ػز زاض و ثطضؾی ق ی وی

1- --drop ثب اؾشفبز اظی عی وبىك بیی ػز لج اظ ثبظیبثی ضا دبن ی

وی سب زاز ب زچبض افعی كس زض نضر اؾشفبز ىطز اظی عی زاز

سبی وبىك ب ی ثه آح طفش قس زض وبىك بی ػز فؼی لطاض ییط

2- --noobjcheck ای عی ثmongorestore ی وvalid وطز

آثؼىز ب ض لج اظ ضز ث وبىك ب بزیس ثیط

ثطای ثبظطزاس اعالػبر وبفی زؾشض یعض ضا ثب اضز وطز فبی ثه آح ضز ظط اػطا وی$cd ~/testmongobackup $mongorestore -d blog –drop

ثبظطزاس وبىك زؾشض ظیط ضا اػطا ی ویثطای

$cd ~/testmongobackup $mongorestore -d blog -c posts --drop

mongoDB سیطیز قطع وبض ثب

زاضای عی بی سیطیشی ظیبزی اؾز و ی سا آب ضا ثب اؾشفبز اظ زؾشض زی ثی

mongod –help اضز زض ظیط آس اؾز .كبس وی

--dbpath .ؿیط دیف فطو ثطای زاز فطػی ثطای زایطوشضی زاز ب اذشهبل ی زسیه ؿیط

یبظ ث زایطوشضی زاز ی ذزـ زاضز حب اط ب ؾ دطزاظـ mongodاؾز ط data/dbب/

mongod ظبی و زاقش ثبقی یبظ ث ؾ زایطوشضی ػساب زاضی.mongod اػطا ی قز

بی mongodزض زایطوشضی زاز ایؼبز ی قز و اظ دطزاظـ mongod.lock یه فبی ثب

زیط mongod.حب اط ؾؼی زاقش ثبقی زیط زض زاذ زایطوشضی ػبضی ػیطی ی وس

ضا زض ب زایطوشضی زاز اػطا وی ثب ذغبی ظیط اػ ی قی"Unable to acquire lock for lockfilepath: /data/db/mongod.lock."

--port 27017ب اذشهبل ی زس ث عض دیف فطو دضر mongodیه قبض دضر ث ؾطض

.اط ثرای و اؾشفبز اظ آ سؾظ دطزاظـ بی زیط ثؼیس اؾز ی ثبقس mongodثطای

69

ضا mongodاط ثرای ضا اػطا وی یبظ ث دضر بی شفبر زاضی mongodچسی

ضی یه دضر و زض حب اؾشفبز اؾز اػطا وی ثب ذغبی ظیط اػ ی قی"Address already in use for socket: 0.0.0.0:27017"

--fork Fork وطز ؾطض اػطایmongoDB ضا ث نضر حیطر ایعی لسضسس ی بیس

--logpath ی ذطػی ب ضا ث یه فبی رهنی و ؾطیغ سط اظ ذطػی ذظ زؾشض اؾز ی

بی logب ضا ساضی ی وس log.و زض نضر جز فبیی ضا ایؼبز ی وس و فطؾشس

بی لسیی سط یع حفظ قس log.زض نضسی و ثرای لسیی سط ضا دبن ی بیس

اؾشفبز ی وی logpath–زض وبض -- logappendاظ

--config اظ یه فبی سظیبر و قب عی بی اضبفی اؾز و زض ذظ فطب یبس اؾز اؾشفبز ی

وس

دیىطثسی ثط دبی ی فبی

mongoDB اظ دیىطثسی اعالػز اظ ضی یه فبی دكشیجبی ی وس

اؾشفبز ی وی config–یب f– ثطای طفش عی بی دیىطثسی اظ یه فبی اظ زؾشض

عی بیی و زض یه فبی دیىطثسی دكشیجبی ی قس زلیمب عی بی ضز دصیطـ زض ذظ

فطب اؾز

ای یه ظب اظ یه فبی دكشیجبی اؾز# Start MongoDB as a daemon on port 5586

port = 5586

fork = true # daemonize it! logpath = mongodb.log

و ثطاثط ثب ب سظیبسی اؾز و زض ذظ فطب اؼب ی زی

ذی ػج بی ػبجی زض ضز ای فبی ب ػز زاضز :

قطع قز یه سضیح اؾز یه زؾشض #ط شی و ثب -1

71

اؾز option=valueكرم وطز عی ب قجی ؾیشىؽ ثطای -2

لطاض زی trueثطاثط ای اؾز و مساض ضا fork–عی بی قجی ثطای -3

mongoDBشلف وطز

ػز زاضز و ػب سطی ضا ح اؾز و mongoDBعی بی ظیبزی ثطای شلف وطز

ضا ثفكبضی سب ؾطض ctrl,cظبی و ؾطض زض سطیب زض حب اػطاؾز ظب ویس سطویجی

اؾز killسلف وس.ضا ح زیط اؾشفبز اظ زؾشض

adminزؾشض زیط ثطای ذبـ وطز ؾطض ای اؾز و ث ػا ازی اضز زیشبثیؽ

ؾشض ظیط ضا اػطا بییثكی ز

{―shutdownServer()‖:1}

monitoringظبضر یب

ظبضر ثطی وبضایی ؾب ثز ؾطض ثطای ط سیط ؾیؿشی ایز زاضز .

زاضای ػب بیی اؾز و ای وبض ضا آؾب وطز اؾز mongoDBذقجرشب

اؾشفبز اظ نفح ی سیطیز

ث ثبالی دضر حی زضایض 1000ضی دضر httpای اؾظ ث عض دیف فطو ثطی ؾطض

mongo ب لطاض زاضز و ای نفح زاضای اعالػبر ای اظ ؾطض ب اؾز

ثطای زیس ای نفح وبفی ؾز ؾطض ضا ضق وی زض طضط ذز ثیؿی

71

28017tp://localhost:ht

ضا 1000اؾشفبز وی زض قبض دضر ػسز دضر زضایض حی + port–چبچ اظ عی ی

ی یؿی

بغض و زض قى ظیط كبس ی قز اىببسی اظ لجی سبییس ػؿشؼ ایسوؽ صاضی

replication اعالػبسی زض ضز ؾطض ػز زاضز

ثطای ایى ثشای اؾشفبز وبی اظی نفح زاقش ثبقی یبظ ث ضق وطز دكشیجب

REST اؾز و ثب زؾشض–rest ای وبض اؼب ی یطز

ضا ضق ی وی mongodچبچ ثرای نفح ی ازی ضا ذبـ ثبقس ظب و

nohttpinterface– ی یؿی

ىش(

دضسبی زضایضب mongoDBث زضایض بی httpیس و اظ عطیك یچ ب سالـ ى

وشط ی قز mongoDBشه ثكیس.ظیطا دضسبی زضایض سب ثب دطسى ؾیی حی

http ثب زضذاؾز بی

ثیؿی ثب قش ی ظیط اػ ی طضط ذز ضا زض :27017http://localhostاط زؾشض

قی

You are trying to access MongoDB on the native driver port.

For http diagnostic access, add 1000 to the port number

72

73

ضؼیز بی ؾطض

اثعاض بی آبضیطی ظیبزی ثطای ضؼیز یطی زض ضز ؾطض ػز زاضز ثب قش زؾشض

serverStatus زض ذظ فطب شبیغ ظیط ضا بیف ی زس

ى اؾز ویس ب ثب سیط شفبر mongoDB ؿر ی platform)ثب سػ ث

ثبقس(

74

كبس وی و ثطای jsonچی ی سای اعالػبر طثط ث ضؼیز ضا زض یه فبی

كبس ای فبی زض طضط ذز ی یؿی

)/_status28017http://localhost:(

ث ثطضؾی چس ویس ی دطزاظی

75

"globalLock" "mem" "indexCounters" "misses" "hits" "background Flushing" "opcounters" "asserts"

Mongostat

ذیی لسضسس اؾز ا زاضای ىبیؿ وبضثطدؿسی ثطای وبضبی ظبضسی ساضز serverStatus اطچ

طا وطز اس و یه نفح ی وبضثط mongoDBثب mongostatیه mongoDB ذقجرشب ی سظیغ بی

دؿس ثطای ذطػی ضؼیز ؾطض زاضز

Mongostat زض طبی ضؼیز ؾطض ضا زض اعالػبر ی اظ ضؼیز ؾطض ضا زض ذطػی چبح ی وس و

اظ ضؼیز ؾطض زاقش ثبقی real-timeیه ذظ ػسیس ث ب ی زس و ثبػض ی قز ب یه زیس

,inserts/s, commands/s چبح ی قز زاضای ػبیی كبث mongostatط ؾشی و زض

vsize, % locked اؾز و زلیمب ثطاثط ثب زاز بی ػز زضserverStatus اؾز

76

Security

ایز ا ثطای ط سیط ؾیؿش ای اؾز و اظ ایز ؾیؿش ذز اعیب وبفی ضا زاقش ثبقس.

زض حیغی ا ثطی بقی mongoDBای اؾز و mongoDBثشطی ضا ح ثطای وشط ایز ثب

بی ای و سابیی اسهب ثب ؾطض ضا زاضس اػطا ثكز

authentication ان

ای اىب ضا زاضز و قب وبضثطا شؼسزی ثبقس mongoDBط زیشبثیؽ زض

قس اػبظ ی اػب ذاس authenticateظبی و ایز ؾیؿش ضا فؼب ی بیی سب وبضثطا

قش ثطی زیشبثیؽ ب ضا زاضس

adminاظ یه دبیب زاز ی اذشهبنی ثب authenticationزض ثحض mongoDBالظ ث شوط اؾز و

و وبضثط ازی ث ػا یه ؾدط وبضثط زض ظط طفش ی قز اؾشفبز ی وس

وبضثط ازی ی ساس ط وبضی ثطی زیشبثیؽ بی ػز اؼب زس چی authenticationثؼس اظ

اؾز shutdown show dbsلبزض ث اؼب زؾشضاسی قجی

اثشسا الظ اؾز و یه وبضثط ازی ث ؾیؿش ذز اضبف وی فؼب وطز ایز لج اظ قطع ثحض > use admin switched to db admin > db.addUser("root", "abcd"); { "user" : "root", "readOnly" : false,

"pwd" : "1a0f1c3c3aa1d592f490a2addc559383"

} > use test switched to db test > db.addUser("test_user", "efgh"); { "user" : "test_user", "readOnly" : false,

"pwd" : "6076b96fc3fe6002c810268702646eec"

} > db.addUser("read_only", "ijkl", true); { "user" : "read_only", "readOnly" : true,

"pwd" : "f497e180c9dc0655292fee5893c162f1"

77

}

زاضی testبض و كبس ی ویس یه وبضثط ازی ز وبضثط زض زیشبثیؽ

trueاؾز فمظ اػبظ ی ذاس اظ زیشبثیؽ ضا زاضز و ای وبض ثب read_onlyو یه وبضثط

وطز مساض آضب ؾ شس اؼب دصیطفش اؾز وبضثط زیط اػبظ ی قش اػبظ ی

ذاس ضا زاضز

ؾغح زؾشطؾی وبضثط ضا سؼیی وطز و ثطای addUserچی ی سا ثب فطاذای شس

وبض اثشسا ثبیس ایز فؼب ثبقسای

سب ثطای اضبف وطز وبضثط ػسیس یؿز ثى ی سا ثب آ ضع addUserىش(سبث

ثز ضا یع سغییط زاز. ای وبض ثسی نضر اؾز و وبفی ؾز شس ضا ثب read_onlyضؼیز

ب وبضثطی ضع ػسیس یب ضؼیز ػسیس فطاذای وی

فؼب وطز ایز

ضا زض ذظ فطب ی auth– جطای فؼب وطز ایز زؾشضی وی restartاثشسا ؾطض ضا

یؿی> use test switched to db test > db.test.find();

error: { "$err" : "unauthorized for db [test] lock type: -1 " }

> db.auth("read_only", "ijkl");

1

> db.test.find();

{ "_id" : ObjectId("4bb007f53e8424663ea6848a"), "x" : 1 }

> db.test.insert({"x" : 2});

unauthorized > db.auth("test_user", "efgh");

1

> db.test.insert({"x": 2});

> db.test.find();

{ "_id" : ObjectId("4bb007f53e8424663ea6848a"), "x" : 1 }

{ "_id" : ObjectId("4bb0088cbe17157d7b9cac07"), "x" : 2 }

> show dbs

78

assert: assert failed : listDatabases failed:{

"assertion" : "unauthorized for db [admin] lock type: 1

", "errmsg" : "db assertion failure",

"ok" : 0

} > use admin switched to db admin > db.auth("root", "abcd");

1

> show dbs admin local test ظبی و ثطای ثبض ا ث دبیب زاز شه ی قی اػبظ ی اؼب یچ ػیبر ذاس

قش ضا ساضی

اػبظ ی اؼب وبضبی ؾبز read_onlyقس ث ػا یه وبضثط authenticateدؽ اظ

بس ػؿشؼ ضا زاضی

read_onlyظبی و لهس ضز زاز ضا زاضی ؼسزا ثب قىؿز اػ ی قی ظیطا یه وبضثط

و وبضثطی زاضای ؼظ قش اؾز ی ساس زاز بی ػسیس ضا ث test_user وبضثط ؿشی

زیشبثیؽ اضز وس

ضا اػطا وس و ای زؾشض سب سؾظ وبضثطا ازی اػطا ی show dbsاب ی ساس زؾشض

قس

authentication ح ی وبضوطز

ظبی و وبضثطا ث زیشبثیؽ ب اضبف ی قس ای وبضثطا زض لبت اؾبزی زض ؼػ ی

sysyem.users شذیط ی قس و ؾبذشبض ای اؾبز ث قى ظیط اؾز {"user" : username, "readOnly" : true, "pwd" : password hash}

اؾزب وبضثطی ضع ثطای hash یه password hashو

ثسیی اؾز و ثطای حصف یه وبضثط وبفی ؾز و ؾس ضز ظط ضا زض ؼػ ی

system.users :دبن وی بس ظیط

79

> db.auth("test_user", "efgh");

1

> db.system.users.remove({"user" : "test_user"}); > db.auth("test_user", "efgh");

0

ایز ؾیؿشؾبیط الحضبر ثطای ثطلطاضی

ػز زاضز و ثبیس ث آب سػ mongoDBعی بی ظیبزی ثطای سؼیی ؾغح زؾشطؾی زض

زاقش ثبقی

ثبیس زلز وی و دطسى ؾیی اؾشفبز ی وی authenticationاظ و ظبی زض اثشسا

mongoDB ث نضر ضع قس یؿز.ثطای ای وبض ثبیس اظ وبث بیSSH ىبیؿ یب زیط

.اؾشفبز وی mongoDBثطای ضع وطز اشمبالر ثی وبضثط ؾطض بی كبث

دكز یه فبیط ا یب یه قجى ی لبث زؾشطؾی سب ثب ؾطض ثطب mongoDBیك ؾطض

ی ب ثبقس.

قب ثطی یه بقیی اؾز و اظ ثیط اػبظ زؾشطؾی زاضز زض ای حبز ثب mongoDBاط

قب ثطی mongoDBحی ث قب زاز ی قز و ipیه bindip--اؾشفبز اظ عی ی

ؿز زؾشض وبفی mongodآ اؾز.ثطای ظب ثطای شه قس اظ ؾطض ثطب س ث

mongod --bindip localhost. اؾشفبز وی

ثطای غیطفؼب وطز اػطای ػبا اؾىطیذز زض ؾز ؾطض زض ظب قطع قس زیشبثیؽ اظ زؾشض

–noscripting اؾشفبز ی وی

81

دكشیجب یطی سؼیط

ؾ ضـ ثطای دكشیجب یطی زاضی mongodbزض

جب یطیدكشی)یب ب ؾیؿش سیطیز زی ثی( ثطای MMSاؾشفبز اظ -1

اؾشفبز اظ ای ؾیؿش سیطیز زاضای عی ی ثبقس

اؾشفبز اظ وذی وطز فبی ب ی زاز-2

mongodumpاؾشفبز اظ زؾشض -3

ب ث ثطضؾی ضـ ؾ ثطای دكشیجب یطی اؾشفبز ی وی

اثعاضی حجة ثطای و mongodump mongorestoreثب اؾشفبز اظ ز زؾشض

شای اظ فبی بیب دكشیجب ثیطی آ ب ضا ضیىبضی ویدكشیجب یطی اؾز ی

81

Replicaton

82

runزض ی ظب بیی و سب ایؼب فشی اظ س اؾشبساض سه ؾطضی اؾشفبز وطزی و ثب

زیشببی ذز ضا اضز زیشبثیؽ ی وطزی اب اؾشفبز اظی ضـ ثطای mongodوطز ؾطض

دطغ بی ثعضي ذغطبن اؾز ظیطا اظ ثی ضفش اعالػبر ؾطض ث ؼبی بثزی وب اؾز

ثطا یح ای كى ب ثبیس وذی بیی اظ زیشببی ذز ضا ضی چسی ؾطض زاقش ثبقی سب ثب

وطز اؾشفبز replicationذبنی زضیط كی . زی ثی ثطای ح ای كى اظ كى

primary secondry arbitaryی و و زاز ب ثطای ظب ضی ؾ ؾطض ثب ب بی

شذیط ی قس

حب ث زؾشض ظیط سػ ویس

$ mongo --nodb

> replicaSet = new ReplSetTest({"nodes" : 3})

83

ی سای اظ replicasetزض ای زؾشض ب ؾ ز ایؼبز وطز ای ثطای ث اػطا زضآضز ای

اؾشفبز وی ثبیس اثشسا زؾشضار ظیط ضا اػطا وی mongodزؾشض

> // starts three mongod processes > replicaSet.startSet() > > // configures replication > replicaSet.initiate()

ایؼبز ی وی 31000زض طح ثؼس ای ؾطض ذز ضا ضی دضر

> conn1 = new Mongo("localhost:31000")

connection to localhost:31000

testReplSet:PRIMARY>

testReplSet:PRIMARY> primaryDB = conn1.getDB("test")

test

ایؼبز قس ثب اؾشفبز اظ زؾشض ظیط ی سایس 31000زض دضر primaryای ؾطض ثب ب

كبس ویس replicasetضؼیز ذز ضا زض

> primaryDB.isMaster() { "setName" : "testReplSet", "ismaster" : true, "secondary" : false, "hosts" : [

"wooster:31000",

"wooster:31002",

"wooster:31001"

],

"primary" : "wooster:31000",

"me" : "wooster:31000",

84

"maxBsonObjectSize" : 16777216,

"localTime" : ISODate("2012-09-28T15:48:11.025Z"),

"ok" : 1

}

او ث ؾطاؽ ایؼبز زی ؾطض ذز ی ضی

> conn2 = new Mongo("localhost:31001")

connection to localhost:31001

> secondaryDB = conn2.getDB("test")

Test

ایؼبز قس حب اط ثرای دطؼ ػی ظیط ضا اؼب ثسی ثب ذغب 31001ز ز ثطی دضر

ی سای زؾشطؾی ث زاز ب زاقش ثبق secondaryاػ ی قی ظیطا ث ػا

> secondaryDB.coll.find()

error: { "$err" : "not master and slaveok=false", "code" : 13435 }

ثطای اػبظ زاز ث زؾشطؾی ای ز ث زاز ب ی سا اظ زؾشض ظیط اؾشفبز وطز

> conn2.setSlaveOk()

> secondaryDB.coll.find()

{ "_id" : ObjectId("5037cac65f3257931833902b"), "count" : 0 }

{ "_id" : ObjectId("5037cac65f3257931833902c"), "count" : 1 }

{ "_id" : ObjectId("5037cac65f3257931833902d"), "count" : 2 }

...

{ "_id" : ObjectId("5037cac65f3257931833903c"), "count" : 17 }

{ "_id" : ObjectId("5037cac65f3257931833903d"), "count" : 18 }

{ "_id" : ObjectId("5037cac65f3257931833903e"), "count" : 19 }

Type "it" for more

85

> > secondaryDB.coll.count()

1000

یىجبض زیط ؾؼی زض قش یه ؾس ثب ای زاضی اب ثبظ ثب ذغب اػ یكی

> secondaryDB.coll.insert({"count" : 1001})

> secondaryDB.runCommand({"getLastError" : 1})

{ "err" : "not master",

"code" : 10058,

"n" : 0,

"lastOp" : Timestamp(0, 0),

"connectionId" : 5,

"ok" : 1

}

چطا؟

replicateاػبظ قش اظ ؾز والیز ضا ساضز سب ی ساس زیشببی secondry ز

قس ضا ثیؿس

اط ؾطض انی ذبـ ثك چ اسفبلی ی افش؟

> primaryDB.adminCommand({"shutdown" : 1})

ض ایجبض ضی ز ز اػطا ی وی سب ثجیی وی ؾطض انی اؾز؟ ismasterثبظ زؾشض

> secondaryDB.isMaster()

{ "setName" : "testReplSet", "ismaster" : true,

86

"secondary" : false, "hosts" : [

"wooster:31001",

"wooster:31000",

"wooster:31002"

],

"primary" : "wooster:31001",

"me" : "wooster:31001",

"maxBsonObjectSize" : 16777216,

"localTime" : ISODate("2012-09-28T16:52:07.975Z"),

"ok" : 1

}

ػبیعی ؾطض انی secondaryزض ثبال شوط قس اؾز و ؾطض انی اظ وبض افشبز ؾطض

قس ی سای یه ؾطض انی ػسیسی ضا اضبف وی

ض شلف وی وبفی ثیؿی replicasetا ثرای ای

> replicaSet.stopSet()

87

88

PHP and MongoDB

اؾشفبز وی PHPزض ای فه یبز ی یطی و چغض زیشبثیؽ ذز ضا عطاحی وی اظ ؼػ ب زض

یبز ی یطی PHPضا زض insert,update,delete,modifyچی اػبی چ

mongodb phpمبیؿ ی ؼػ ب زض

keysزذیط ی قس و قب json زض فه لج یبز طفشی و اؾبز زض ؼػ ب ث فطز

values ؿشس.ای كبث ضفشبضphp زض یه آضای یassociative اؾز ثبثطای

, so it shouldn’t be too difficult to get used to this format. For example, assume a document looks like the following in the MongoDB shell: contact = ( { "First Name" : "Philip", "Last Name" : "Moran", "Address" : [ {

"Street" : "681 Hinkle Lake Road",

"Place" : "Newton",

"Postal Code" : "MA 02160",

89

"Country" : "USA" } ], "E-Mail" : [ "pm@example.com", "pm@office.com", "philip@example.com", "philip@office.com", "moran@example.com", "moran@office.com", "pmoran@example.com", "pmoran@office.com" ],

"Phone" : "617-546-8428",

"Age" : 60

})

اؾز phpاؾز و قجی آضای ب زض mongodbای فطز ب ؾس زض $contact = array( "First Name" => "Philip", "Last Name" => "Moran", "Address" => array(

"Street" => "681 Hinkle Lake Road",

"Place" => "Newton",

"Postal Code" => "MA 02160",

"Country" => "USA" ) , "E-Mail" => array( "pm@example.com", "pm@office.com", "philip@example.com", "philip@office.com", "moran@example.com", "moran@office.com", "pmoran@example.com", "pmoran@office.com" ),

"Phone" => "617-546-8428",

91

"Age" => 60

); اؾز php; زض >اؾز و و ):( ب ؾج ای ز ؾس قجی ؿشس سب سفبر آ ب زض ای

MongoDB Classes

چ ذبنیز GridFSوالؼ انی اؾز چی ثطای وبض ثب 4زاضای phpثطای mongodbزضایض

زیط یع اىببر زاضز.

اظ ای والؼ بی انی ثرف ی اظ زضایض زی ثی اؾز و ای والؼ ب ثب اىب اؾشفبز غی

زؾشضار ضا زض زاذ ثطب ث ب ی زس

ای والؼ بی ث قطح ظیط اؾز

MongoClient قطع وس ی اضسجبط ثب زیشبثیؽ فطا وس ی ؾطض ثطای اؼب ػیبسی بس

connect(), close(), listDBs(), selectDBs(), and selectCollection().

MongoDB: ثب زیشبثیؽ ثطای اؼب زؾشضاسی بساضسجبط createCollection(),

selectCollection(), createDBRef(), getDBRef(), drop(), and getGridFS().

• MongoCollection: ایؼبز اضسجبط ثب ؼػ ب ثطای اؼب زؾشضاسی بس as count(),

find(), findOne(), insert(), remove(), save(), and update().

• MongoCursor ػاة ایؼبز اضسجبط ثب شبیغ حبن اظ ثطكزfind ب ثطای ظب زؾشضاسی بس getNext(), count(), hint(), limit(), skip(), and sort().

Connecting and Disconnecting زیشبثیؽ ؼػ ی ذبنی اؾشفبز زض ای فه یبز ی یطی چغض اظ زضایض ثطای اسهب ث یه

وی

یه اسهب ث زی ثی ضا ایؼبز ی وی Mongoاثشسا ثب اؾشفبز اظ والؼ

زاقش ثبقی phpزؾشض ظیط كب ی زس و چغض یه اضسجبط ؾطیغ ث زیشبثیؽ ضا اظ عطیك

// Connect to the database $c = new MongoClient(); // Select the database you want to connect to, e.g contacts $c->contacts;

اؾز و ی سا ثب آ ث زیشبثیؽ ضز ظط شه ()selectDBچی زاضای سبثغ mongoوالؼ

ثكی// Connect to the database $c = new MongoClient(); // Select the database you want to connect to, e.g. contacts

91

$c->selectDB("contacts"); ظب ثؼسی كب ی زس و چغض ؼػ ی ضز ظط ذز ضا ثطای وبض ضی آ اشربة وی

زاقشی زض ای ػب دبثطػبؾز ثطای ظب اط shellچی لایی و زض ب وبض وطز ثب

ؼػ ای ضا اشربة وی و ظ ػز ساضز زض ب اضز وطز زاز ث آ ؼػ ث عض ذزوبض ایؼبز

ی قز.چی اشربة وطز ؼػ ی ضز ظط بس اشربة وطز زیشبثیؽ ضز ظط اؾز ث ػجبضر

ثطای كب زاز ؼػ ضز ظط زض دطؼ ػی ذز اؾشفبز وی بس ظب ظیط (<-) اظ شیط ی سای// Connect to the database $c = new Mongo(); // Selecting the database ('contacts') and collection ('people') you want // to connect to $c->contacts->people;

ای اػبظ ضا ی زس و ؼػ ای ضا اشربة وی ثی ؼػ ب ()selectCollectionچی سبثغ

ؾییچ وی// Connect to the database $c = new Mongo(); // Selecting the database ('contacts') and collection ('people') you want // to connect to $c-> selectDB("contacts")->selectCollection("people"); لج اظ شه قس ث یه زیشبثیؽ یب ؼػ ی ذبل ب یبظ زاضی و زیشبثیؽ ؼػ ب ضا ثجیی ثطای

ای وبض اظ زؾشضار ظیط ی سا اؾشفبز وطز// Connecting to the database $c = new Mongo(); // Listing the available databases print_r($c->listDBs());

ثطای ؼػ ب یع ث ی نضر اؾز// Connecting to the database $c = new Mongo(); // Listing the available collections within the 'contacts' database print_r($c->contacts->listCollections());

اؾز و اظ آ ثطای ثؿش اضسجبط ثب ؾطض زیشبثیؽ ()cloesثغ ثب زاضای یه سب mongoچی والؼ

اؾشفبز ی وی اب اؾشفبز اظ آ ذیی الظ یع ظیطا ثؼع ضؼیز بی غیطػبزی زضایض اسهب ضا ث نضر

اسبسیه ی ثسز// Connecting to the database $c = new Mongo(); // Closing the connection $c->close();

92

Insert وطز زاز ب زض زیشبثیؽ

ی سای ؾس ذز ضا ث ؼػ اضبف وی ()insertثب اؾشفبز اظ زؾشض

زض لس ا ؾس ذز ضا ث ػا یه شغیط سؼطیف ی وی ؾذؽ آ ضا اضز زیشبثیؽ ی وی

insertی وی ؾذؽ ثب اؾشفبز اظ زؾشض سؼطیف phpزض ظب ظیط ؾس ذز ضا ثب اؾشفبز اظ آضای زض

اضز زیشبثیؽ ی وی$contact = array( "First Name" => "Philip", "Last Name" => "Moran", "Address" => array(

"Street" => "681 Hinkle Lake Road",

"Place" => "Newton",

"Postal Code" => "MA 02160",

"Country" => "USA" ) , "E-Mail" => array( "pm@example.com", "pm@office.com", "philip@example.com", "philip@office.com", "moran@example.com", "moran@office.com", "pmoran@example.com", "pmoran@office.com" ),

"Phone" => "617-546-8428",

"Age" => 60

); ()insertاضز وطز زض زیشبثیؽ ثب اؾشفبز اظ زؾشض

// Connect to the database $c = new MongoClient(); // Select the collection 'people' $collection = $c->contacts->people; // Insert the document '$contact' into the people collection '$collection' $collection->insert($contact);

اؾشفبز اظ دطؼ ػ

93

ثطای دطؼ ػ طفش اظ زاز بی زض زیشبثیؽ ذز اظ ػطبی دطؼ ػ اؾشفبز ی وی

*اؾشفبز وطز .ثطای ظب ثطای دیسا وطز ثط اؾبؼ عی ای زض یه ؾس س زض س ی سا اظ *// Connect to the database $c = new MongoClient(); // Select the collection 'people' from the database 'contacts' $collection = $c->contacts->people; // Use dot notation to search for a document in which the place // is set to "Newton" $address = array("Address.Place" => "Newton"); // Execute the query and store it under the $cursor variable $cursor = $collection->find($address); // For each document it finds within the collection, print the ID // and its contents while ($document = $cursor->getNext()) { print_r($document); }

94

GridFS

GridFS

ب زض زیبیی ظسی ی وی و حؼ زاز ب فبی ب ذیی ػظی ؿشس شذیط وطز ای

زاز ب زض یه ؾس وبضی ثؽ زقاض اؾز وبض وطز ثب آ وبضی زقاضسط

حبال ضا ح ای كى زض زی ثی ضا ثطضؾی ی وی

GridFS یه ىبیؿ ثطای زذیط ؾبظی فبی بی ثعضي زضmongodb اؾز

95

اؾز mongofilesاؾشفبز اظ gridfsؾبز سطی ضا ثطای وبض وطز ثب

Mongofiles ىببر ثطای اؾشفبز اظ فبی ب زض قب سب اgridfs اؾز بس آدز فبی

از ػؿشؼ ...ز

ضا كب ی زس Gridfsاظ فبی ؾیؿش ضز ظط ث ظب دبیی چی آدز وطز فبی

$ echo "Hello, world" > foo.txt $ ./mongofiles put foo.txt

connected to: 127.0.0.1

added file: { _id: ObjectId('4c0d2a6c3052c25545139b88'),

filename: "foo.txt", length: 13, chunkSize: 262144,

uploadDate: new Date(1275931244818),

md5: "a7966bf58e23583c9a5a4059383ff850" }

done! $ ./mongofiles list

connected to: 127.0.0.1

foo.txt 13

$ rm foo.txt $ ./mongofiles get foo.txt

connected to: 127.0.0.1

done write to: foo.txt $ cat foo.txt Hello, world

اؾشفبز وطز ای get put list بس mongofilesزض ای زؾشض ب اظ ػیبر ؾبز زض

یه یؿز اظ list اضبف وطز ای GridFsفبی ضا اظ فبی ؾیؿش طفش ای ث putو ثب

ضا اؼب ی زس putوبضی ثطػىؽ وبض getضا ك ی زس gridfsفبی بی ػز زض

ی یطز ث ؾیؿش فبی ب اضبف ی وس Gridfsیؼی فبی ضا اظ

96

Mongofiles ػیبر ػؿشؼ زض چی اظ زgridfs ثطاؾبؼ ب فبی حصف فبی زض

gridfs ضا زاضا ی ثبقس

ای اؾز و فبی بی ثعضي ضا ث سى بی بی ػساب ای GridFsزضحمیمز دكز دطز ی

ضا زض ؾس ػساب ای شذیط ی وس chunk ط سجسی ی وس chunkثب

ب زض یه وبىك ذبل شذیط ی قس chunkای

اؾز id_ضا كب ی زی و بس زیط اؾبز زاضای chunkزض ظیط یه ظب اظ ؾس

{ "_id" : ObjectId("..."),

"n" : 0,

"data" : BinData("..."), "files_id" : ObjectId("...") }

:n كب زس ی لؼیز یهchunk زض فبی

:Data بیف ثبیز بی فبی زض ایchunk

Gridefs فبی ضا زض ز وبىك ثب بیchunks files شذیط ی وس

The chunks Collection

ثهضر ظیط اؾز chunksیه ؾس زض وبىك

{

"_id" : <ObjectId>,

"files_id" : <ObjectID>,

"n" : <num>,

"data" : <binary>

}

chunks._id

97

آثچىز آیسی طثط ث ای ؾس اؾزchunks.files_id

.filesآثؼىز آیسی طثط ث فبی انی زض وبىك

chunks.n ها chunkدنباله ی عددی از

chunks.data

The chunk’s payload as a BSON binary type

98

1ضی ی

Wire Protocol

اؾشفبز TCP/IPزؾشیبثی زاضس اظ یه دطسى ؾیی mongoDBزضایضبی و ث ؾطض

اؾز.ثطای ظب BSONی بیس و ث نضر اؾبؾی قب یه دقف ضری زض زاز بی

ثطای BSONثبیز سض زیشب ب ؼػ یؿز اؾبز 20یبظ ث insertثطای یه زؾشض

ضز ث ؼػ ی ضز ظط زاضی

99

Data Files

ػز اؾز.فبی بی data/dbػال ثط ػز زیشب زایطوشضی و ثهضر دیف فطو زض

چس فبی ns.زاضز ط زیشبثیؽ قب یه فبی ػساب زیطی ثطای ط دبیب زاز ػز

زیشب اؾز و ث عض یىاذز سؼساز آ ب زض حب ؿشطـ اؾز

foo.0 foo.1 foo.2 فبی بی foo.nsحبی یه غبی ثب fooثبثطای زیشبثیؽ

غیط ی ثبقس.

ط فبی ز ثطاثط ی قز سب اساظ ی فبی بی زاز ثطای یه دبیب زاز ثسی نضر اؾز و

ی ثبیز ذز ثطؾس 2ث اساظ ی بوعی

ای ضفشبض ثبػض ی قز و زض شذیط ؾبظی زیشبثیؽ بی وچه كى ث سض ضفش فضببی

ضی زیؿه فضببی ظایس ضا ساقش ثبقی زیشبثیؽ بی ثعضي زض ىب بی عزیه

شذیط قس

mongoDB چی زیشب فبی بی ضا اظ لج ث زیشبثیؽ ب اذشهبل ی زس و ای وبض

--ثبػض وبضایی ثشط ؾیؿش ی قز و ثطای غیطفؼب وطز ای لبثیز وبفی ؾز زؾشض

noprealloc ضا اػطا وی

ظبی و فبیی دط قز نضر ی یطز.ای mongoDBاذشهبل زاز زض دكز ظی ی

زیشبفبی بی اضبفی ذبی ضا ثطای ط زیشبثیؽ mongoDBی اؾز و ؾطض ثسا ؼ

ساضی ی وس اظ اؾشفبز قس آب ثطای سرهیم زاز فضب ػیطی ی وس

Namespaces and Extents ث و اؾبزی.قز ی ؾبظبسی namespace یه لبت زض زیشبثیؽ ط ب زیشبفبی زض

زاضز ضا ذزـ ث رهل ب فضبی زاضای زاضز شؼك ؼػ یه

ی شذیط زیشبفبی اظ بی section زض زیؿه ضی زض ب فضبی ط ث طثط اعالػبر

111

زاضز ب extent و قز

قس زاز اذشهبل لج اظ ی ط و زاضز ػز فبی زیشب ؾ foo زیشبثیؽ زض ظیط قى زض

فضبی چسی ث و بیی extents ث ب زیشبفبی اظ ا سبی ز.ثبقس ی ذبی ی اس

اس قس سمؿی زاضس سؼك ب

زاضز ػز ثبال قى ضز زض ػبت ی ىش چس

ضی زض اظب و ثبقس شفبر ع اظ بیی extents زاضای ساس ی ب فضبی ط

ساضز لطاض دیؾش نضر ث زیؿه

و بیی extents بی track و اؾز بی فضبی freelist$ و زس ی كب چی

زاضز ی ضا كس اؾشفبز ظیبزی ظب سر ث

ضا freelist اثشسا قز ی زاز اذشهبل ای سبظ extents ب فضبی یه ث و ظبی

وس ی ػؿشؼ ضا extents ثب بؾت فضبی یه وطز دیسا ثطای

111

112

Sell آشنایی با

113

114

ضا زض ؾطض دضر كرهی هت وطز ای mongodزض حبز ػبزی فطو ب ثطا ای اؾز و

ضز ظط ذز ضا اشربة ی وی ث اب زض نضسی و بس حبز ثبال جبقس اثشسا ؾطض دضر

/ا ن ی قی$ bin/mongo staging.example.com:20000

شه ی قی زض نضر اسهب ث زیشبثیؽ زیط اظ زؾشض ظیط اؾشفبز test ث نضر دیف فطو اثشسا ث

ی وی

$ bin/mongo localhost:27017/admin

ن ی قز admin زیشبثیؽ 27017 دضر localhostزؾشض ثبال ث ؾطض

ى زی ثی ثس اسهب ث یچ زیشبثیؿی ن ثكی اظ زؾشض ظیط اؾشفبز shellچی ی سای ث

وی$ bin/mongo --nodb

MongoDB shell version: 1.5.3

type "help" for help >

بی connectionیؿز ب ی سای اظ Database Connectionسب dbث یبز زاقش ثبقیس و

زاقش ثبقی شفبسی ث حیظ بی شفبسی و ؾطض زض آ ب لطاض زاضز

زاقش ثبقی connectionی سای چسی shardingثطای ظب ثب اؾشفبز اظ

> mongos = connect("localhost:27017")

connecting to: localhost:27017

localhost:27017

> shard0 = connect("localhost:30000")

connecting to: localhost:30000

localhost:30000

> shard1 = connect("localhost:30001")

connecting to: localhost:30001

localhost:30001

اؾشفبز وی dbث ػا شغیطبی mongos shard0 shard1ثبثطای ب ی سای اظ

Shell Utilities ی سای ث چسی ؾطض شه ثكی shellثب اؾشفبز اظ

> shard_db = connect("shard.example.com:27017/mydb")

connecting to shard.example.com:27017/mydb

115

mydb >

ضا اػطا وی shellچی ی سای زؾشضار طثط ث > runProgram("echo", "Hello", "world") shell: started mongo program echo Hello world

0

> sh6487| Hello world

آ طاػؼ وی manualػز زاضز و ثبیس ث shellثؿیبضی اظ وبضثطزبی ػبت

buildInfo

{"buildInfo" : 1} زؾشضی و سؾظ ازی اػطا ی قز اعالػبسی زض ضز زی ثی ؿر ی ؾطض ؾیؿش ػب

ی زس یعثب ث ب

collStats {"collStats" : collection}

اعالػبسی زض ضز ؼػ ب ؾبیع زاز ب فضبی شذیط ؾبظی ؾبیع ایسوؽ ب زض اذشیبض ب

لطاض ی زسDistinct

{"distinct" : collection, "key": key, "query": query} دطؼ ػ ضا ث ب ی زساضظـ بی شفبر ویس بی یبفز قس زض شیؼ ی

Drop {"drop" : collection}

ی اعالػبر زض یه ؼػ ضا حصف ی وس

dropDatabase

{"dropDatabase" : 1}

ی زاز بی زض یه زیشبثیؽ ضا حصف ی وسdropIndexes

{"dropIndexes" : collection, "index" : name} ثبقس "*" ضا اظ ؼػ حصف ی وس زض نضسی و ب name ی ایسوؽ ب ثب ب

ی ایسوؽ ب ضا اظ ؼػ حصف ی وسgetLastError

{"getLastError" :1} ذغبب ؾبیط ضؼیز بی ایؼبز قس سحز آذطی ػیبر ضا كب ی زس

116

> db.count.update({x : 1}, {$inc : {x : 1}}, false, true)

> db.runCommand({getLastError : 1})

{ "err" : null, "updatedExisting" : true,

"n" : 5,

"ok" : true }

زؾشض ثبال سؼساز اؾبزی ضا و سحز سبطیط آدسیز لطاض طفش اس ضا بیف ی زس

isMaster

{"isMaster" : 1} slaveاؾز یب masterؾطض ضا ثطضؾی ی وس سب ثجیس و ؾطض

listCommands

{"listCommands" : 1} یؿز زؾشضار ػز ثطی ؾطض ضا طا ثب سضیحبسی زض ضز آب ی آضز

listDatabases

{"listDatabases" : 1} ای زؾشض سؾظ ازی اػطا ی قز یؿز زیشبثیؽ ب ضا ث ب ی زس

Ping

{"ping" : 1} ی وس ای زؾشض ػاة ضا ؾطیغ ثطی طزاس حشی اط ؾطض لف قس ثبقسػز زاقش ؾطضی ضا چه

renameCollection {"renameCollection" : a, "to" : b}

ث ؼػ foo.barسغییط ی زس. ثبیس ط ز زاضای ب وب ثبقس ثطای ظب bث aب ؼػ ضا اظ

bar زض زیشبثیؽfoo اقبض ی وس

repairDatabase

{"repairDatabase" : 1} دبیب زاز ی ػبضی ضا سؼیط فكطز ی وس و ای زؾشض زاضای ظب اػطای ثبالیی اؾز

serverStatus

{"serverStatus" : 1}

117

آبضبی اػطایی ثطای ؾطض ػبضی ضا بیف ی زس

Install MongoDB

118

Install for 32-bit Linux

لس ا:

ثیشی یوؽ زاز ی وی 32ضا ثطای ؾیؿش ػب mongodbآذطی ضغ اظ

http://downloads.mongodb.org/linux/mongodb-linux-i686-2.5.4.tgz

ضغ زازی قب فطق زاقش ثبق ثب ضغ ثبالى

:لس ز

فبی ظیخ قس ضا اوؿشطوز ی وی

tar -zxvf mongodb-linux-i686-2.5.4.tgz

لس ؾ:

وذی وی mongodbی سای فبی اوؿشطوز قس ضا زض فبی اشربثی ذز ظال mkdir -p mongodb

cp -R -n mongodb-linux-i686-2.5.4/ mongodb

لس چبض:

ضا ث mongodbػز زض binضا اؼب ثسی و ثبیس ؿیط فبی PATHی سای سظیبر طثط ث

PATH اضبف وی

ضا ایؼبز وی.ث نضر دیف فطو زی ثی زاز ب ضا زض data directoryحب یبظ زاضی و

زض آ ػز زاضز mongodbی یؿس .اظ زؾشض ظیط زض زایطوشضی ػبضی و data/db/زایطوشضی

اؾشفبز ویسmkdir -p /data/db

زض آ ػز زاضز ی قی mongodاو ؾطض زی ثی ضا اػطا ی وی.ثطای ای وبض اضز ؾیطی و

اػطااؾز.ثب اؾشفبز اظ زض حب mongoضا اػطا ی وی.حب ؾطض طثط ث mongod زؾشض

Control+C ی سای ؾطض ضا ذبـ وی

119

Install MongoDB on Windows

MongoDB forWindows زاز

آذطی ضغ اظ زی ثی ضا ثطای ؾیؿش ذز زاز ی وی -1

اوؿشطوز ی وی C فبی زاز قس ضا زض زضای -2

C:\mongodb directory ایؼبز ی وی data زض دق db دق ای زیط ثب C زض زضای dataحب یه دق ثب -3

Run MongoDB ضا اػطا ی وی mongodاثشسا ث ؿیط ظیط ی ضی زؾشض ثطای ضق وطز ؾطض

C:\cd mongodb\bin C:\mongodb\bin\mongod.exe

ی سا ؾطض ضا ذبـ وی Control+Cحب ثب اؾشفبز اظ

اؾز اؾشفبز data/db/اط ثرای اظ زایطوشضی زاز ی زیطی ثؼع زایطوشضی دیف فطو و ب

بیی ثبیس زض ب ضق وطز ؾطض زایطوشضی زاز ی ضز ظط ضا یع كرم وی

C:\mongodb\bin\mongod.exe --dbpath "d:\test\mongo db data"

زیطی ضا ثبظ وی زؾشض ظیط ضا اػطا وی cmd ثبیس یه shellثطای ن قس ث C:\mongodb\bin\mongo.exe

111

111

بثغ

wowebook_Oreilly.MongoDB

.The.Definitive.Guide.Sep.20

10 – Kyle Banker — MongoDB in

Action — 2011 MongoDB-Manual