
ãã®æçš¿ã¯ãå°ããªmongodb
ããŒãã·ãŒããšãããã€ãã®ã¬ã·ãã䜿çšããmongodb
é·ãã¯ãšãªã§ãã å°ããªãã®ã1ãæã«éããããŠãããšäŸ¿å©ãªå ŽåããããŸãmongodb
èå³ããã人mongodb
誰ã§ãèªåã«åœ¹ç«ã€ãã®ãèŠã€ããŠãã ããã
SQL vs. NOSQL
ãããã¯ã«é¢ããããªããŒã®ããŒã§æçš¿ãèªèãããããšã¯æãŸãããããŸããã SQL vs. NOSQL
ãããŠãã©ãã«ã§ãè³åŠäž¡è«ãããããšã¯æããã§ãããã®å Žåãããã¯ã©ããã«å°ãå©ãã«ãªããã©ããã«ããªãã察åŠããªããã°ãªããªãã£ãããã€ãã®äŸã«ãªããŸãã mongo shell
ããã³python
äŸã
- mongodbã®æ°ããããŒãžã§ã³ãžã®ç§»è¡
- æ¯èŒã¯ãšãªãšè«çã¯ãšãª
- Mongodbãæ£èŠè¡šçŸãã€ã³ããã¯ã¹ãªã©ã§ã®å
šææ€çŽ¢
- ååæŒç®åïŒããŒã¿ã®å€æŽïŒ
- Mongodbã®ãã©ã³ã¶ã¯ã·ã§ã³ã«ã€ããŠå°ã
- Mongodbã®éçŽãã¬ãŒã ã¯ãŒã¯ãšJOIN
- äŸ
- Pythonå°ããªãµã³ãããã¯ã¹
mongodbãžã®ç§»è¡
ããŒãžã§ã³2.6ãž
ããŒãžã§ã³2.6
ã®ãªãªãŒã¹åŸã mongodb
ã¯ãããŒã¿ããŒã¹ãåã
ã®ã³ã¬ã¯ã·ã§ã³ã«ãŠãŒã¶ãŒæš©éãå²ãåœãŠãããã®æ°ããã·ã¹ãã ã远å ããŸããã ãããŠãããã«å¿ããŠãæŽæ°æã«ã¯ãããèæ
®ã«å
¥ããå¿
èŠããããŸãã
1ïŒããŒãžã§ã³2.4
ããããŒãžã§ã³2.6
ã«åãæ¿ããå¿
èŠããããŸãã 2.2
ãã2.6
ãžã®2.2
ã¯æ©èœãããäžäœäºææ§ããªããããæ®µéçã«æŽæ°ããå¿
èŠããããŸãã
å®éãæŽæ°èªäœïŒ
apt-get update apt-get install mongodb-org
2ïŒ 2.6
ã¢ããã°ã¬ãŒãããåŸã admin
ããŒã¿ããŒã¹ã«ç§»åããŠãããã¥ã¡ã³ãã®äºææ§ããã§ãã¯ããããã€ãã®ã³ãã³ããå®è¡ããå¿
èŠããããŸãã
use admin db.upgradeCheckAllDBs()
3ïŒ mongodb
ããŒãžã§ã³2.6
以éãæ¢ã«è¿°ã¹ãããã«ãèªã¿åããæžã蟌ã¿ãªã©ã®ã³ã¬ã¯ã·ã§ã³ãŸã§ã®åœ¹å²åmongodb
ããã³ãŠãŒã¶ãŒã®èšå®æš©éãåºçŸããããããããã®åœ¹å²ãé©å®èšå®ããå¿
èŠããããŸããããããªããšã auth
ã³ãã³ããå®è¡ã§ããŸããã ã
db.auth('admin','password')
ãããè¡ãã«ã¯ããŸãadmin
ããŒã¿ããŒã¹ã«ã管çè
ããŠãŒã¶ãŒãäœæããŸã
db.createUser({user:"admin", pwd:"passwd", roles:[{role:"userAdminAnyDatabase", db:"admin"}]})
4ïŒãã®åŸãç®çã®ããŒã¹ã«ç§»åããŸãããã®ããŒã¹ã§äœæ¥ãè¡ããæ¥ç¶ããŸããããã«ãŠãŒã¶ãŒãäœæããŸãã
use newdb db.createUser({user:"admin", pwd:"passwd", roles:[{role:"dbAdmin", db:"newdb"}]})
system.users
ã³ã¬ã¯ã·ã§ã³ã®admin
ããŒã¿ããŒã¹ã«ã¬ã³ãŒããèªåçã«äœæãããŸã
次ã®ã³ãã³ãã§ããŒã¿ããŒã¹ãŠãŒã¶ãŒã衚瀺ã§ããŸãã
db.runCommand( { usersInfo: [ { user: "admin", db: "newdb" } ], showPrivileges: true } )
ãŸãããã®ãã¹ãŠã®åŸããªãŒããŒããŒãããããšãå¿ããªãã§ãã ããã
service mongod restart
ãã®ããŒãžã§ã³ã®ubuntu
ã§ã¯ããµãŒãã¹ã¯mongodb
ãªãmongod
ãšåŒã°ãã /etc
ã®èšå®ã¯mongod.conf
ãšåŒã°ããŸããããã¯ãã¢ããã°ã¬ãŒãäžã«æ··ä¹±ããªãããã«äžäœäºææ§ããªãããã§ãã
2.6ãã3.0ããŒãžã§ã³
æ°ããããŒãžã§ã³3.0
ãšã¹ãã¬ãŒãžãšã³ãžã³ã®é©æ°çãªå€æŽã«ã€ããŠã¯ããã§ã«å€ãã®ããšãæžãããŠããŸããç¹°ãè¿ããŸããã
3.0
ã¢ããã°ã¬ãŒãããåã«3.0
ããŒãžã§ã³2.6
ã«ãžã£ã³ãããã«é 次ã¢ããã°ã¬ãŒãããããšããå§ãããŸãã ããã¯2.2->2.4->2.6
ã§ãã
ææ°ããŒãžã§ã³ã¯2.6.5
以äžãæšå¥šããŸãã
ubuntu
ã®ã€ã³ã¹ããŒã«èªäœubuntu
ããªãæšæºã§ã
3çªç®ã®ããŒãžã§ã³ã®ãªããžããªã远å ããŸãã
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
Ubuntu 15.04
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
ã€ã³ã¹ããŒã«ïŒ
apt-get update apt-get install -y mongodb-org
åã³ã³ããŒãã³ãã«ã€ããŠãã€ã³ã¹ããŒã«äžã«ããŒãžã§ã³ã瀺ããŸãã
apt-get install -y mongodb-org=3.0.2 mongodb-org-server=3.0.2 mongodb-org-shell=3.0.2 mongodb-org-mongos=3.0.2 mongodb-org-tools=3.0.2
ãã®åŸïŒ
service mongod stop service mongod start
mongodb
ã®ããŒãžã§ã³ãèŠãŠã¿ãŸããmongodb
ã
root@user-pc:~
ããŒãžã§ã³3
å Žåããã¹ãŠãããŸããã£ãã®ã§ãã¹ãã¬ãŒãžã倿Žã§ããŸãã ããã©ã«ãã¯MMAPv1
ã§ãã
/etc/mongo.conf
倿Žãã/etc/mongo.conf
ã¯ããªãã·ã§ã³ã远å ããŸãã
storageEngine = wiredTiger
æ°ãããªããžããªã«é¢é£ããå¯èœãªãªãã·ã§ã³ã®è©³çްã«ã€ããŠã¯ã ãã¡ããã芧ãã ããã
ãããŠã /var/lib/mongodb
空ã«ãªãããã«ããŸããããããªããšã mongodb
ã¯èªç¶ã«èµ·åããŸããããã®åã«ããã¹ãŠã®ããŒã¿ããŒã¹ã«å¯ŸããŠmongodump
ãå®è¡ããå¿
èŠããããŸã
service mongod restart
ã¹ãã¬ãŒãžã®ãšã³ãžã³ã®ããŒãžã§ã³ã確èªããŸãã
root@user-pc:/etc
ããstorageEngine
ãªããã¹ãŠãstorageEngine
ããã°wiredTiger
ãæ¢ããŠããŸãã
"storageEngine" : { "name" : "wiredTiger" }
ããã§ã admin
ãå«ãããŒã¿ããŒã¹ãã€ã³ããŒãããå¿
èŠããããŸã
mongorestore --port 27017 -d admin
PyMongoã®æ°æ©èœ
ããŒã¿ããŒã¹ã®æ°ããããŒãžã§ã³ãšäžç·ã«ã Python
PyMongo
çšã®æ°ããããŒãžã§ã³ã®ãã©ã€ããŒPyMongo
ãããã€ãã®å€ãã¡ãœãããåé€ãããŸããïŒ
pip install -U pymongo
ããŒã¿ããŒã¹èªäœãæŽæ°ããªããŠãããã¹ãŠã以åã®ããã«æ©èœããããã§ã¯ãããŸããã ããã«æ°ã¥ããããšããïŒ
- ãŠãããŒãµã«åãšçµ±äžã®ããã«ãã¡ãœãã
update_one, insert_many, find_one_and_delete
仿§ã« update_one, insert_many, find_one_and_delete
ãŸãã - ãŸããçµ±åã®ããã«ã
MongoClient
ããŒã¿ããŒã¹ã«æ®ãããã³ãã¯ã¿ã¯1ã€ã ãã§ããã MongoClient
ãã'slave_okay': True
ãªã©ã®ãªãã·ã§ã³'slave_okay': True
åé€ãããŸããã ReplicaSetConnection
ãšMasterSlaveConnection
åé€ãããŸããã MongoReplicaSetClient
ãäºææ§ã®ããã«ãã°ããã®éæ®ãããŠããŸãã
䜿çšäŸïŒ
>>>
copy_database
ã¡ãœãããåé€end_request()
ã¡ãœããã¯end_request()
ãend_request()
代ããã«close()
ã䜿çšããããšããå§ãããŸãã- ã³ãã¥ããã£ã®äžéšã¯ã
asyncio
ããã®éåæããã°ã©ãã³ã°ãšasyncio
ãã€ãã£ããµããŒããããããšãæåŸ
ããŠããŸããããæ®å¿µãªããæ®å¿µã§ãã asyncio
çšã®åªããã¢ãŒã¿ãŒãã©ã€ããŒããããŸãããæ®å¿µãªããã asyncio
çšã«ã¯ãå®éšçãªasyncio-mongoãã©ã€ããŒã®ã¿ãäžååã«éçºãããŠããã GridFS
ãµããŒãããããŸãGridFS
éèšãã¬ãŒã ã¯ãŒã¯ã§ã¯ãã«ãŒãœã«ã¯
result
ã§ã¯ãªãããã«è¿ãããããã«
result
ã
æ¯èŒã¯ãšãªãšè«çã¯ãšãª
$eq
æ¯èŒæŒç®å
$eq
db.test.find({ field: <value> })
åçã§ã
{ _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] } { _id: 2, item: { name: "cd", code: "123" }, qty: 20, tags: [ "B" ] } db.test.find( { qty: { $eq: 20 } } )
$ gt以äž
$gt
ã¯ããã£ãŒã«ãå€ãæå®ãããå€ãã倧ãã(>)
ææžãéžæããŸãã
db.test.find( { qty: { $gt: 10 } } )
$ gteã¯ä»¥äž
$gte
ã¯ããã£ãŒã«ãã®å€ãæå®ãããå€ä»¥äž(>=)
ããã¥ã¡ã³ããéžæããŸãã
db.test.find( { qty: { $gte: 10 } } )
$ ltããå°ãã
$lt
ã¯ããã£ãŒã«ãã®å€ãæå®ãã(<)
ããå°ããããã¥ã¡ã³ããéžæ(<)
ãŸã
db.test.find( { qty: { $lt: 10 } } )
$ lte以äž
$lte
ã¯ããã£ãŒã«ãå€ãæå®ããå€ä»¥äž(<=)
ããã¥ã¡ã³ããéžæ(<=)
ãŸã
db.test.find( { qty: { $lte: 10 } } )
売ãæã®å©çã100
æªæºã®å Žåããã¬ãã¢ã ã¯ç¡å¹ã§ãã
db.test.update({ "vendor.profit": { $lte: 100 } }, { $set: { premium: 0 } })
$ neã¯çãããããŸãã
$ne
ã¯ããã£ãŒã«ãå€ãæå®ãããå€ãšçãããªã(! =)
ææžãéžæããŸãã
db.test.find( { qty: { $ne: 10 } } )
ãšã³ããªãŒãã§ãã¯ã§$
{ _id: 1, qty: 10, tags: [ "name", "lastname" ], } db.test.find({ tags: { $in: ["name", "lastname"] } } )
æ£èŠè¡šçŸã®äŸ
db.test.find( { tags: { $in: [ /^be/, /^st/ ] } } )
$ ninéãšã³ããªãã§ãã¯
$in
åã$in
ããéãåæ§ã§ãé
åã«å€ãæ¬ èœããŠããããšã確èªããŸãã
db.test.find( { qty: { $nin: [ 5, 15 ] } } )
$ãŸãã¯æŒç®åãŸãã¯
å€å
žçãªæŒç®å
ã¯ããã€ãã®å€ãåãããããã®å°ãªããšã1ã€ãæ¡ä»¶ã«äžèŽããããšã確èªããŸãã
db.test.find( { $or: [ { quantity: { $lt: 10 } }, { price: 10 } ] } )
ãã®ã¯ãšãªã§ã¯ã2ã€ã®ã€ã³ããã¯ã¹ãã³ã³ãã€ã«ããããšãææ¡ãããŠããŸãã
db.test.createIndex( { quantity: 1 } ) db.test.createIndex( { price: 1 } )
ãã«ããã¹ãæ€çŽ¢ã§$or
$text
æŒç®åãšçµã¿åãããŠäœ¿çšââããå Žåãã€ã³ããã¯ã¹ãå¿
èŠã§ãã
$ããã³æŒç®åãandã
ãªãã¬ãŒã¿ãŒã¯ãæ€çŽ¢ãããææžå
ã«ãªã¹ããããŠãããã¹ãŠã®å€ã®ååš
ãã§ãã¯ããŸãã
db.test.find( { $and: [ { price:10 }, { check: true } } ]
$or
次ã®äŸ
db.test.find( { $and : [ { $or : [ { price : 50 }, { price : 80 } ] }, { $or : [ { sale : true }, { qty : { $lt : 20 } } ] } ] } )
åŠå®æŒç®åã§ã¯ãªã
éžæå
ã®æ¡ä»¶ã«äžèŽããããã¥ã¡ã³ãããªãããšã確èªããŸãã
db.test.find( { price: { $not: { $gt: 10 } } } )
æ£èŠè¡šçŸã®äŸïŒ
import re for no_docs in db.test.find( { "item": { "$not": re.compile("^p.*") } } ): print no_docs
$ãŸãã¯æŒç®ånot or
db.test.find( { $nor: [ { price: 10 }, { qty: { $lt: 20 } }, { sale: true } ] } )
ãã¹ãã³ã¬ã¯ã·ã§ã³å
ã®ãã®ã¯ãšãªã¯ã次ã®ããã¥ã¡ã³ããæ€çŽ¢ããŸãã
- äŸ¡æ Œãã£ãŒã«ãã®å€ã10ã§ã¯ãããŸãã
- qtyãã£ãŒã«ãã®å€ã¯å°ãªããšã20ã§ã
- ãsaleãã®å€ã¯ãtrueãã§ã¯ãããŸãã
$ã¯ãã£ãŒã«ãã®ååšããã§ãã¯ããŠååšããŸã
$exists
ã¯ãç¹å®ã®ããŒãååšãããååšããªãããã¥ã¡ã³ããååŸããŸãã
ãã©ã¡ãŒã¿false
ãšããŠ$exists
ãæå®$exists
ãšããªã¯ãšã¹ãã¯qty
ããŒãå®çŸ©ãããŠããªãããã¥ã¡ã³ããè¿ããŸãã
db.test.find( { qty: { $exists: true } } )
$ã¿ã€ãBSON
ã¿ã€ããã§ãã¯
db.test.find( { field: { $type: -1 } } );
å¯èœãªã¿ã€ãïŒçš®é¡ | æ° | 泚é |
ããã« | 1 | |
ã²ã | 2 | |
察象 | 3 | |
é
å | 4 | |
ãã€ããªããŒã¿ | 5 | |
æªå®çŸ© | 6 | éæšå¥šã |
ãªããžã§ã¯ãID | 7 | |
ããŒã«å€ | 8 | |
æ¥ä» | 9 | |
ãã« | 10 | |
æ£èŠè¡šçŸ | 11 | |
Javascript | 13 | |
èšå· | 14 | |
JavaScriptïŒã¹ã³ãŒãä»ãïŒ | 15 | |
32ãããæŽæ° | 16 | |
ã¿ã€ã ã¹ã¿ã³ã | 17 | |
64ãããæŽæ° | 18 | |
æå°ã㌠| 255 | -1ã䜿çšããã¯ãšãªã |
æå€§ã㌠| 127 | |
$ mod
$mod
æŒç®åã¯ãå€ãæåã®åŒæ°ã§é€ç®ãããé€ç®ã®æ®ãã2çªç®ã®åŒæ°ã«çãããã£ãŒã«ããéžæããããã«äœ¿çšãããŸãã
ããšãã°ãããã¥ã¡ã³ãããããŸãïŒ
{ "_id" : 1, "item" : "aa123", "qty" : 0 } { "_id" : 2, "item" : "bb123", "qty" : 7 } { "_id" : 3, "item" : "cc123", "qty" : 15 }
ãªã¯ãšã¹ãïŒ
db.test.find( { qty: { $mod: [ 5, 0 ] } } )
次ã®ããã¥ã¡ã³ããè¿ããŸãã
{ "_id" : 1, "item" : "aa123", "qty" : 0 } { "_id" : 3, "item" : "cc123", "qty" : 15 }
SQL
ããã®ã¢ããã°
select * from t where qty % 5 = 0;
C 2.6
ããŒãžã§ã³ã§ã¯ã1ã€ã®èŠçŽ ã®ã¿ã転éããããšã¯çŠããããŠããããšã©ãŒãè¿ãããŸãã ãŸãã3ã€ä»¥äžã®åŒæ°ãæž¡ããšããšã©ãŒãçæãããŸãã以åã®ããŒãžã§ã³ã§ã¯ãäœåãªåŒæ°ã¯åã«ç¡èŠãããŠããŸããã
ãã¹ãŠéžæãã¹ãŠäžèŽ
é
åã®è€æ°ã®èŠçŽ ãäœæããŸãã
db.test.find( { tags: { $all: [ "python", "mongodb", "javascript" ] } } )
$ elemMatch
åããµãããã¥ã¡ã³ãã«å±ãã2ã€ä»¥äžã®å±æ§ãæ¯èŒããå¿
èŠãããå Žåã«äœ¿çšããŸãã
é
åå
ã«ãã¹ãŠã®æ¡ä»¶ã«äžèŽããèŠçŽ ãããããšã確èªããŸãã
{ _id: 1, results: [ 82, 85, 88 ] } { _id: 2, results: [ 75, 88, 89 ] } db.test.find( { results: { $elemMatch: { $gte: 80, $lt: 85 } } } )
çµæãåŸãããŸãã
{ _id: 1, results: [ 82, 85, 88 ] }
å¥ã®äŸïŒ
{ _id: 1, results: [{ product: "abc", score: 10 }, { product: "xyz", score: 5}] } { _id: 2, results: [{ product: "abc", score: 8 }, { product: "xyz", score: 7}] } { _id: 3, results: [{ product: "abc", score: 7 }, { product: "xyz", score: 8}] } >db.test.find( { results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } } ) { "_id": 3, "results": [{ "product": "abc", "score": 7 }, { "product": "xyz", "score": 8 } ] }
é
åã®é·ãã«ãã$ãµã€ãºã®æ€çŽ¢
$size
æŒç®åã¯ãé
åå
ã®èŠçŽ ã®æ°ã$size
å€ã«çããããã¥ã¡ã³ããæ€çŽ¢ããŸãã ããšãã°ãlaguagesé
åã«2ã€ã®èŠçŽ ããããã¹ãŠã®ããã¥ã¡ã³ããæœåºããŸãã
db.persons.find ({languages: {$size:2}})
ãã®ãããªãªã¯ãšã¹ãã¯ãããšãã°æ¬¡ã®ããã¥ã¡ã³ãã«å¯Ÿå¿ããŸãã
{"name": "Alex", "age": "32", languages: ["python", "mongodb"]}
$äœçœ®æŒç®å
$
ã¯ããŸããŸãªå Žåã«äœ¿çšã§ããŸãã é
åã®å€ãã©ã®ã€ã³ããã¯ã¹ã®äžã«ããã®ãããããªãããããã䜿çšãããå Žåã¯ããäœçœ®æŒç®åãã䜿çšããŸã
ããšãã°ãããã¥ã¡ã³ãããããŸãïŒ
{ "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] } { "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] }
ãããŠãããããæ€çŽ¢ããåŸãããã¥ã¡ã³ãå
šäœã§ã¯ãªããã¯ãšãªã«å¯Ÿå¿ãã1ã€ã®å€ã®ã¿ã衚瀺ãããããã«ããŸãããäºåã«ã©ã®å€ãååšãããã¯ããããŸããã
>db.test.find( { semester: 1, grades: { $gte: 85 } }, { "grades.$": 1 } ) { "_id" : 3, "grades" : [ 85 ] }
æŽæ°ã®äŸïŒ
db.test.update( { _id: 22 } , { $set: { "array.$.name" : "alex" } } )
$ã¹ã©ã€ã¹ã¯ç¯å²ãèŠã€ãã
$slice
é
åã«ä¿åãããŠããå€ã®ç¯å²ãæ€çŽ¢ããŸãã
æåã®10åã®ã€ãã³ããèŠã€ããŸãã
db.test.find( { }, { "events" : { $slice: 10 } } )
éå»10ä»¶ã®ã€ãã³ããæ€çŽ¢ïŒ
db.test.find( { }, { "events" : { $slice: -10 } } )
Mongodbãæ£èŠè¡šçŸãã€ã³ããã¯ã¹ãªã©ã§ã®å
šææ€çŽ¢
Habréã«ã¯ãmongodb`ã®
åªããåºçç©ããããŸãããããã以æ¥ãæ°ããæŒç®åãšæ°ããæ©èœã远å ãããŸããã
ããã¹ãæ€çŽ¢ã¯ã€ã³ããã¯ã¹ãªãã§ã¯æ©èœããªãããããããã«ã€ããŠèª¬æããŸãããã
ä»»æã®ããã¹ããã£ãŒã«ããŸãã¯é
åã«å¯ŸããŠåçŽãªã€ã³ããã¯ã¹ãäœæãããŸãã
db.test.createIndex( { title: "text", content: "text" } )
ãã£ãŒã«ãåãŸãã¯ã¯ã€ã«ãã«ãŒã修食åã䜿çšã§ããŸãã
db.text.createIndex( { "$**": "text" } )
å
šææ€çŽ¢çšã®ã€ã³ããã¯ã¹ãäœæããå Žåãè±èªã§ãªãå Žåã¯èšèªãèæ
®ããå¿
èŠããããŸãã
db.test.createIndex( { content : "text" }, { default_language: "russian" } )
ããŒãžã§ã³2.6
以éãå€ãã®èšèªã®ããã¹ãã€ã³ããã¯ã¹ãäžåºŠã«èšå®ã§ããããã«ãªããŸããã
玢åŒãäœæã§ããç¥èªãå«ãçµã¿èŸŒã¿èšèªã- ããŸãã¯ãã³ããŒã¯èª
- nlãŸãã¯ãªã©ã³ãèª
- enãŸãã¯è±èª
- fiãŸãã¯ãã£ã³ã©ã³ãèª
- frãŸãã¯ãã©ã³ã¹èª
- ããŸãã¯ãã€ãèª
- è¡ãŸãã¯ãã³ã¬ãªãŒäºº
- ãããŸãã¯ã€ã¿ãªã¢èª
- nbãŸãã¯ãã«ãŠã§ãŒèª
- ptãŸãã¯ãã«ãã¬ã«èª
- roãŸãã¯ã«ãŒããã¢èª
- ruãŸãã¯ãã·ã¢èª
- esãŸãã¯ã¹ãã€ã³èª
- svãŸãã¯ã¹ãŠã§ãŒãã³èª
- trãŸãã¯ãã«ã³èª
MongoDB
ã¯ãã€ã³ããã¯ã¹ã®äœææã«ããã¥ã¡ã³ãã§æå®ãããèšèªã䜿çšããŸãã ããã¥ã¡ã³ãã§æå®ãããèšèªã¯ãããã©ã«ãã®èšèªããªãŒããŒã©ã€ãããŸãã åã蟌ã¿ããã¥ã¡ã³ãã®èšèªã¯ãã€ã³ããã¯ã¹ã®ä»ã®ãã¹ãŠããªãŒããŒã©ã€ãããŸãã
{ _id: 1, language: "portuguese", original: "A sorte protege os audazes.", translation: [ { language: "english", quote: "Fortune favors the bold." }, { language: "russian", quote: " ." } ] }
ãŸãã language_override
ãã©ã¡ãŒã¿ãŒã䜿çšããŠlanguage_override
ãã£ãŒã«ããæå®ããããšãã§ããŸãã
ããšãã°ãããã¥ã¡ã³ãã®å ŽåïŒ
{ _id: 2, idioma: "english", quote: "Fortune favors the bold." } { _id: 3, idioma: "russian", quote: " ." }
ã€ã³ããã¯ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
db.text.createIndex( { quote : "text" }, { language_override: "idioma" } )
ã€ã³ããã¯ã¹ã«ã¯ãããšãã°æ¬¡ã®ãããªç¹å¥ãªåå{ name: "name" }
å²ãåœãŠãããšãã§ããŸãã
db.text.createIndex( { content: "text", "users.title": "text" }, { name: "text_Index" } )
ãã®ååã¯ãã€ã³ããã¯ã¹ã®åé€ã«äœ¿çšãããšäŸ¿å©ã§ãã
db.text.dropIndex("text_Index")
ãŸããããã¹ãã€ã³ããã¯ã¹ã®å Žåãæ€çŽ¢ãããã£ãŒã«ãã®éèŠåºŠãéã¿ãèšå®ã§ããŸãã
ããšãã°ã次ã®ãã£ãŒã«ãã«éã¿ãèšå®ããŸãïŒ content - 10
ã keywords - 5
ãããã³title - 1
ã
db.test.createIndex( { content: "text", tags: "text", title: "text" }, { weights: { content: 10, tags: 5, }, name: "TextIndex"} )
ã€ã³ããã¯ã¹ã䜿çšããŠãåºåã®ã¬ã³ãŒãæ°ãå¶éã§ããŸãã
{ _id: 1, dept: "one", content: "red" } { _id: 3, dept: "one", content: "red" } { _id: 2, dept: "two", content: "gren" } db.test.createIndex( { dept: 1, content: "text" } ) db.test.find( { dept: "one", $text: { $search: "green" } } )
ã€ã³ããã¯ã¹ã«å¶éããããããåºåã¯2ã€ã§ã¯ãªã1ã€ã®ããã¥ã¡ã³ãã«ãªããŸãã
Python
ãµã³ãã«ã€ã³ããã¯ã¹ïŒ
ããã¹ãæ€çŽ¢
mongodbã§ããã¹ãæ€çŽ¢ã衚瀺ãããçŽåŸã«ãrunCommandã䜿çšããŠå®è¡ãããŸãããæ¬¡ã«äŸã瀺ããŸãã
db.collection.runCommand( "text", { search: "" } )
ãã ããããŒãžã§ã³2.6
以éãæ°ããæŒç®å$ text
åäžåèªæ€çŽ¢ïŒ
db.articles.find( { $text: { $search: "coffee" } } )
è€æ°åèªæ€çŽ¢ïŒ
db.articles.find( { $text: { $search: "bake coffee cake" } } )
ãã¬ãŒãºã§æ€çŽ¢ïŒ
db.articles.find( { $text: { $search: "\"coffee cake\"" } } )
æ€çŽ¢ãããã£ãŒã«ããé€å€-
db.articles.find( { $text: { $search: "bake coffee -cake" } } )
ãŸãã mongodb 2.6
ã§ã¯ãå¥ã®$ã¡ã¿æŒç®åã衚瀺ããããªã¯ãšã¹ããšäžèŽããçµæã®ç²ŸåºŠã瀺ãããŸããã
db.text.insert([ { "_id": 4, "descr" : " " }, { "_id": 3, "descr" : " -" }, { "_id":6, "descr" : " " }, { "_id":7, "descr" : " " }, { "_id":8, "descr" : " " }, { "_id":9, "descr" : ", " }, { "_id":10, "descr" : ", " }, { "_id":11, "descr" : " " } { "_id":12, "descr" : " " }, { "_id":13, "descr" : " " }, ]) db.text.createIndex( { descr : "text" }, { default_language: "russian" } ) db.text.find( { $text: { $search: "" } }, { score: { $meta: "textScore" } }).sort( { score: { $meta: "textScore" } } ) { "_id" : 13, "descr" : " ", "score" : 0.75 } { "_id" : 4, "descr" : " ", "score" : 0.6666666666666666 } { "_id" : 6, "descr" : " ", "score" : 0.6666666666666666 } { "_id" : 12, "descr" : " ", "score" : 0.6666666666666666 }
ããã§{ score: { $meta: "textScore" } }
çµæã«å«ãŸããå€ã«æ°ãããã£ãŒã«ããäœæãããããæ¢ã«ãœãŒãã«é¢äžããŠããŸãã
$ regexãæ€çŽ¢
MongoDB
ã¯Perl
äºæã®æ£èŠè¡šçŸã䜿çšããŸãã
db.test.insert([ { "_id" : 1, "descr" : "abc123" }, { "_id" : 2, "descr" : "abc123" }, { "_id" : 3, "descr" : "eee789" } ]) db.test.find( { sku: { $regex: /^ABC/i } } ) { "_id" : 1, "sku" : "abc123", "description" : "Single line description." } { "_id" : 2, "sku" : "abc123", "description" : "Single line description." }
i
倧æåãšå°æåãåºå¥ããŸããã
PostgreSQL
ã¢ããã°
select title from article where title ~ '^a' 'abc'
ååæŒç®åïŒããŒã¿ã®å€æŽïŒ
éåžžããããã®ä¿®é£Ÿåã¯ãã¹ãŠã db.test.update()
ããã³db.test.findAndModify()
æŽæ°æäœã«äœ¿çšãããŸã
$ inc increment
æå®ãããå€ã ããã£ãŒã«ãã墿žããŸãã
db.test.update( { _id: 1 }, { $inc: { qty: -2, "orders": 1 } } )
$乿°ã®å¢å
ãã£ãŒã«ãå€ã«æå®ãããå€ãä¹ç®ããŸãã
{ _id: 5, item: "mac", price: 10 } db.test.update({ _id: 1 }, { $mul: { price: 2 } } ) { _id: 5, item: "mac", price : 20 }
$ååãã£ãŒã«ãã®åå倿Ž
{ "_id": 1, "name": "alex" } db.test.update( { _id: 1 }, { $rename: { 'name': 'alias'} } ) { "_id": 1, "alias": "alex" }
$ setã¯ãã£ãŒã«ãã®å€ã倿ŽããŸã
ããã¯ããããupdate
䜿çšãããäž»ãªå€æŽæŒç®åã§ãã å€ãã®å Žåãmongodbã®ã³ã³ããã¹ãã§ã®åçŽãªãã©ã³ã¶ã¯ã·ã§ã³ãšããŠèšæ¶ãããŸãã
db.test.save({ "_id":8, "qty":"", tags:"" }) db.test.update( { _id: 8 }, { $set: { qty: 100, tags: [ "linux", "ubuntu"] } }) { "_id" : 8, "qty" : 100, "tags" : [ "linux", "ubuntu" ] }
$ setOnInsertã¯ãæ°ããããã¥ã¡ã³ãã«ãã£ãŒã«ãã远å ããŸã
update
3çªç®ã®åŒæ°ã¯ããªãã·ã§ã³{ upsert: true }
ããã¯ã倿Žã®ããã¥ã¡ã³ããèŠã€ãããªãã£ãå Žåãæ°ããããã¥ã¡ã³ããäœæããããšãæå³ããŸãã ãŸãã $setOnInsert
ãªãã·ã§ã³ã¯ãããã«æ¿å
¥ãããã£ãŒã«ãã$setOnInsert
ãŸãã
>db.test.update( { _id: 7 }, { $set: { item: "windows" }, $setOnInsert: { os: 'bad' } }, { upsert: true } ) { "_id" : 7, "item" : "windows", "os" : "bad" }
$set
ãå®è¡ãããã£ãŒã«ãã¯ãæ°ããäœæãããããã¥ã¡ã³ãã«ã衚瀺ãããŸãã
$ unsetã¯ããŒãåé€ããŸã
{ "_id" : 8, "qty" : 100, "tags" : [ "linux", "ubuntu" ] } db.test.update( { _id: 8 }, { $unset: { qty: "", tags: "" } } ) { "_id" : 8 }
æå°ã®å Žåãæå°æŽæ°
$min
ã¯ãã£ãŒã«ããæŽæ°ããŸããæå®ãããå€ããã£ãŒã«ãã®çŸåšã®å€ããå°ããå Žåã $min
ã¯ç°ãªãã¿ã€ãã®å€ãæ¯èŒã§ããŸãã
> db.test.save({ _id: 9, high: 800, low: 200 }) > db.test.update( { _id:9 }, { $min: { low: 150 } } ) >db.test.findOne({_id:9}) { "_id" : 9, "high" : 800, "low" : 150 }
$ maxã¢ããããŒã
$max
ã¯ãæå®ãããå€ããã£ãŒã«ãã®çŸåšã®å€ãã倧ããå Žåã«ãã£ãŒã«ããæŽæ°ããŸãã
> db.test.save({ _id: 9, high: 800, low: 200 }) > db.test.update( { _id:9 }, { $max: { high: 900 } } ) > db.test.findOne({_id:9}) { "_id" : 9, "high" : 900, "low" : 200 }
$ currentDateã¯çŸåšã®æ¥ä»ãèšå®ããŸã
ãã£ãŒã«ãã®å€ãçŸåšã®æ¥ä»ã«èšå®ããŸãã
> db.test.save({ _id:11, status: "init", date: ISODate("2015-05-05T01:11:11.111Z") }) > db.test.update( { _id:12 }, { $currentDate: { date: true } } ) > db.test.findOne({_id:12}) { "_id" : 12, "status" : "a", "date" : ISODate("2015-05-10T21:07:31.138Z") }
é
åã®å€æŽ
$ addToSetãå€ã远å ããªãå Žå
é
åã«å€ããŸã ãªãå Žåã¯å€ã远å ããå€ãããå Žåã¯äœãããŸããã
db.test.save({ _id:1, array: ["a", "b"] }) db.test.update( { _id: 1 }, { $addToSet: {array: [ "c", "d" ] } } ) { "_id" : 1, "array" : [ "a", "b", [ "c", "d" ] ] } db.test.update( { _id: 1 }, { $addToSet: {array: "e" } } ) { "_id" : 1, "array" : [ "a", "b", [ "c", "d" ], "e" ] }
$ popã¯æåãŸãã¯æåŸãåé€ããŸã
é
åã®æåãŸãã¯æåŸã®èŠçŽ ãåé€ããŸãã -1ãæå®ãããŠããå Žåãæåã®èŠçŽ ãåé€ããã1ãæå®ãããŠããå ŽåãæåŸã®èŠçŽ ãåé€ãããŸãã
> db.test.save({ _id: 1, scores: [ 6, 7, 8, 9, 10 ] }) { "_id" : 1, "scores" : [ 6, 7, 8, 9, 10 ] } > db.test.update( { _id: 1 }, { $pop: { scores: -1 } } ) > db.test.findOne({_id:1}) { "_id" : 1, "scores" : [ 7, 8, 9, 10 ] } > db.test.update( { _id: 1 }, { $pop: { scores: 1 } } ) > db.test.findOne({_id:1}) { "_id" : 1, "scores" : [ 7, 8, 9 ] }
$ pullAllã¯ãæå®ããããã¹ãŠãåé€ããŸã
æå®ããããã¹ãŠã®èŠçŽ ãé
åããåé€ããŸãã
{ _id: 1, scores: [ 0, 2, 5, 5, 1, 0 ] } db.test.update( { _id: 1 }, { $pullAll: { scores: [ 0, 5 ] } } ) { "_id" : 1, "scores" : [ 2, 1 ] }
èŠæ±ã«å¿ããŠ$ãã«åé€
{ _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] } > db.test.update( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } ) { _id: 1, votes: [ 3, 5 ] }
$ pushã¯å€ã远å ããŸã
é
åã«å€ã远å ããŸãã
db.test.update( { _id: 1 }, { $push: { scores: 100} } )
$pushAll
$ pushã®ä¿®é£Ÿå
äžåºŠã«ãããã
ãªã¹ããããåã¢ã€ãã ãé
åã«è¿œå ããŸãã
ããšãã°ããããè¡ãå ŽåïŒ { $push: { scores: [ 2, 10 ] } }
ãã®å Žåãåºåã¯æ¬¡ã®ãããªé
åã«ãªããŸãïŒ "scores" : [7, 8, 9, 90, 92, 85, [ 2, 10 ] ]
ã€ãŸããé
åã§ããèŠçŽ ããã1ã€è¿œå ãããŸãã
ãããŠã $each
ãä»ããŠããªã¹ãã®åèŠçŽ ãé
åã®èŠçŽ ãšããŠè¿œå ãããå ŽåïŒ
> db.test.update( { _id: 1 }, { $push: {scores: { $each: [ 90, 92, 85 ] } } } ) {"_id" : 1, "scores" : [7, 8, 9, 90, 92, 85, 2, 10 ] }
$ pushã䜿çšããå Žåã$ã¹ã©ã€ã¹ã¯ã¢ã€ãã æ°ãå¶éããŸã
$push
貌ãä»ãããšãã«é
åèŠçŽ ã®æ°ãå¶éããŸãã å¿
ç¶çã«$each
ã䜿çšããŸã$each
ãããªãã§äœ¿çšããããšãããšããšã©ãŒãè¿ãããŸãã
{ "_id" : 1, "scores" : [ 10, 20, 30 ] } > db.test.update( { _id: 1 }, { $push: { scores: { $each: [50, 60, 70], $slice: -5 } } } ) { "_id" : 1, "scores" : [ 20, 30, 50, 60, 70 ] }
$slice
ã¯20
ã®æåã®èŠçŽ ãåãåããŸãã -5
ãªã5
æå®ããå ŽåãæåŸã®èŠçŽ 70
è¿ãããŸãã
$ sort sorté
åèŠçŽ
æå®ããããã£ãŒã«ãã«åŸã£ãŠé
åã®èŠçŽ ããœãŒãããŸãã $each
æŒç®å$each
ã䜿çšããããšãå¿
é ã§ãã æ¿å
¥ããã«äžŠã¹æ¿ããå¿
èŠãããå Žåã¯ã $each
ã空çœã®ãŸãŸã«ããããšãã§ããŸãã
{ "_id" : 2, "tests" : [ 80, 70, 80, 50 ] } > db.test.update( { _id: 2 }, { $push: { tests: { $each: [40, 60], $sort: 1 } } }) { "_id" : 2, "tests" : [ 40, 50, 60, 70, 80, 80 ] }
å¥ã®äŸïŒ
db.test.update( { _id: 1 }, { $push: { field: { $each: [ ], $sort: { score: 1 } } } }) { "_id" : 1, "field" : [ { "id" : 3, "score" : 5 }, { "id" : 2, "score" : 6 }, { "id" : 1, "score" : 7 }, ] }
$äœçœ®ã¯æ¿å
¥äœçœ®ã瀺ããŸã
å€ãæ¿å
¥ããé
åèŠçŽ ã®ã«ãŠã³ãã瀺ããŸãã
{ "_id" : 1, "scores" : [ 100 ] } db.test.update({ _id: 1 }, {$push: { scores: { $each: [50, 60, 70], $position: 0 } } }) { "_id" : 1, "scores" : [ 50, 60, 70, 100 ] }
$ãããã¯ãããããšã«æŽæ°ãããŸã
ãããåäœã®ãã£ãŒã«ãæŽæ°ãå®è¡ããŸãã æŒç®åã¯ãããåäœã®and
ã or
ããã³xor
ãµããŒãããŸãã
{ "_id" : 1, "expdata" : 13 } > db.bit.update({_id:1}, {$bit:{expdata:{and:NumberInt(10)} } } ) { "_id" : 1, "expdata" : 8 }
$åé¢-é§å
ããšãã°ãæŽæ°æäœãè¡ãããŠããéãããã¥ã¡ã³ããèªã¿åãããã³æžã蟌ã¿çšã«ããã¯ããŸãã
å逿ã«$isolated
ãã$isolated
䜿çšïŒ
db.test.remove( { temp: { $lt: 10 }, $isolated: 1 } )
æŽæ°æã«$isolated
ã$isolated
ã䜿çšïŒ
db.test.update( {status: "init" , $isolated: 1 }, { $inc: { count : 1 }}, {multi: true } )
$åé¢ã¯ãã·ã£ãŒãã¯ã©ã¹ã¿ãŒã§ã¯æ©èœããŸãã
ããŒãžã§ã³2.2
ïŒ $isolated
æŒç®åã$atomic
眮ãæãããŸãã
mongodbã®ãã©ã³ã¶ã¯ã·ã§ã³ãäžæã®ã€ã³ããã¯ã¹ã2ãã§ãŒãºã³ãããã«ã€ããŠ
åœç¶ã MongoDB
PostgreeSQL
ãããªåŸæ¥ã®SQL
ãœãªã¥ãŒã·ã§ã³ã®ãããªPostgreeSQL
ã¯ããã§ã¯ãªããããããäžå¯èœã§ãã ãããããªããããã¯ããããå®å
šãªæ£èŠåãšæŽåæ§å¶åŸ¡ãåãããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã«ãªããŸãã
ãããã£ãŠã mongoDB
ãã©ã³ã¶ã¯ã·ã§ã³ã«ã€ããŠèª¬æããå ŽåãååãšããŠã update()
ããã³findAndModify()
ã§äžæã®ã€ã³ããã¯ã¹ãšçµã¿åãããŠäœ¿çšââãããã¿ã€ã$set
ã¢ãããã¯æäœãæå³ããŸãã è€æ°ã®ããŒã¿ããŒã¹å
ã§ãã©ã³ã¶ã¯ã·ã§ã³ã確ä¿ããå¿
èŠãããå Žåããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã§äžè¬çãª2ãã§ãŒãºã³ããããåæ§ã§ãã
äžæã®ã€ã³ããã¯ã¹
mongodb
ã®äžæã®ã€ã³ããã¯ã¹ã«ãããã€ã³ããã¯ã¹ãã£ãŒã«ãã®éè€å€ãå«ããã¹ãŠã®ããã¥ã¡ã³ããæåŠãããŸãã
db.test.createIndex( { "user_id": 1 }, { unique: true } )
ã³ã¬ã¯ã·ã§ã³ããããŸãNik
ãšåŒã³ãŸãããããã®ã³ã¬ã¯ã·ã§ã³ã«ã¯ã name
ãã£ãŒã«ãã®å€ãNik
ããã¥ã¡ã³ãã¯ãããŸããã è€æ°ã®ã¯ã©ã€ã¢ã³ãã{ upsert: true }
ãã©ã¡ãŒã¿ãŒã䜿çšããŠãã®ããã¥ã¡ã³ããåæã«æŽæ°ããããšããŠãããšä»®å®ããŸãïŒæ¡ä»¶ã«ãã£ãŠãæŽæ°ããããã¥ã¡ã³ããååšããªãå Žåãäœæããå¿
èŠãããããšãæå³ããŸãïŒã
äŸïŒ
db.test.update( { name: "Nik" }, { name: "Nik", vote: 1 }, { upsert: true } )
update()
, , , .
, . . , .
unique
false
MongoDB
, A
B
.
:
- `accounts` .
- `transactions` , .
accounts transactions
accounts
db.accounts.insert( [ { _id: "A", balance: 1000, pendingTransactions: [] }, { _id: "B", balance: 1000, pendingTransactions: [] } ] )
transactions
.
db.transactions.insert({ _id: 1, source: "A", destination: "B", value: 100, state: "initial", lastModified: new Date()})
:
source
destination
.value
, .state
. initial
, pending
, applied
, done
, canceling
, canceled
.lastModified
.
1)
, initial
. t
> var t = db.transactions.findOne( { state: "initial" } ) > t { "_id" : 1, "source" : "A", "destination" : "B", "value" : 100, "state" : "initial", "lastModified" : ISODate("2015-05-26T16:35:54.637Z") }
2) pending
initial
pending
.
> db.transactions.update( { _id: t._id, state: "initial" }, { $set: { state: "pending" }, $currentDate: { lastModified: true } } ) > db.transactions.find() { "_id" : 1, "source" : "A", "destination" : "B", "value" : 100, "state" : "pending", "lastModified" : ISODate("2015-05-26T17:02:19.002Z") } >
3)
, , value
, pendingTransactions
_id
( ).
> db.accounts.update( { _id: t.source, pendingTransactions: { $ne: t._id } }, { $inc: { balance: -t.value }, $push: { pendingTransactions: t._id } } ) > db.accounts.update( { _id: t.destination, pendingTransactions: { $ne: t._id } }, { $inc: { balance: t.value }, $push: { pendingTransactions: t._id } } ) > db.accounts.find() { "_id" : "A", "balance" : 900, "pendingTransactions" : [ 1 ] } { "_id" : "B", "balance" : 1100, "pendingTransactions" : [ 1 ] }
4) applied
.
> db.transactions.update( { _id: t._id, state: "pending" }, { $set: { state: "applied" }, $currentDate: { lastModified: true } } ) > db.transactions.find() { "_id" : 1, "source" : "A", "destination" : "B", "value" : 100, "state" : "applied", "lastModified" : ISODate("2015-05-26T17:13:15.517Z") }
5) _id
pendingTransactions
: _id
pendingTransactions
.
> db.accounts.update( { _id: t.source, pendingTransactions: t._id }, { $pull: { pendingTransactions: t._id } } ) > db.accounts.update( { _id: t.destination, pendingTransactions: t._id }, { $pull: { pendingTransactions: t._id } } ) > db.accounts.find() { "_id" : "A", "balance" : 900, "pendingTransactions" : [ ] } { "_id" : "B", "balance" : 1100, "pendingTransactions" : [ ] }
6) done
.
> db.transactions.update( { _id: t._id, state: "applied" }, { $set: { state: "done" }, $currentDate: { lastModified: true } } ) > db.transactions.find() { "_id" : 1, "source" : "A", "destination" : "B", "value" : 100, "state" : "done", "lastModified" : ISODate("2015-05-26T17:22:22.194Z") }
. .
1) canceling
, , canceling
.
db.transactions.update( { _id: t._id, state: "pending" }, {$set: { state: "canceling" }, $currentDate: { lastModified: true }} ) > db.transactions.find() { "_id" : 1, "source" : "A", "destination" : "B", "value" : 100, "state" : "canceling", "lastModified" : ISODate("2015-05-26T18:29:28.018Z") }
2)
.
> db.accounts.update( { _id: t.destination, pendingTransactions: t._id }, { $inc: { balance: -t.value }, $pull: { pendingTransactions: t._id } } ) > db.accounts.update( { _id: t.source, pendingTransactions: t._id }, { $inc: { balance: t.value}, $pull: { pendingTransactions: t._id } } ) > db.accounts.find() { "_id" : "A", "balance" : 1000, "pendingTransactions" : [ 1 ] } { "_id" : "B", "balance" : 1000, "pendingTransactions" : [ 1 ] } >
3) cancelled
.
db.transactions.update( { _id: t._id, state: "canceling" }, { $set: { state: "cancelled" }, $currentDate: { lastModified: true } } ) > db.transactions.find() { "_id" : 1, "source" : "A", "destination" : "B", "value" : 100, "state" : "cancelled", "lastModified" : ISODate("2015-05-26T19:14:11.830Z") }
, . .
findAndModify()
, :
t = db.transactions.findAndModify({ query: { state: "initial", application: { $exists: false } }, update: {$set: { state: "pending", application: "App1"}, $currentDate:{ lastModified: true }}, new: true })
6. JOIN-
JOIN
- mongo
, - . stackoverflow
, , .
, , , , .
- , , { type: 'news' }
.
, , .
, , aggregation framework
. pipeline
. , , , , , ..
, , .
db.test.insert([ { "_id":"gomer", "type":"user", "group":["user", "author"] }, { "_id":"vasya", "type":"user", "group":["user"] } ])
.
db.test.insert([ { "_id": 1, "type": "blogs", "user": "gomer", "article": "aaa" }, { "_id": 2, "type": "blogs", "user": "vasya", "article": "bbb" }, { "_id": 3, "type": "blogs", "user": "gomer", "article": "ccc" } ])
, . , .
, , , "".
users = [doc._id for doc in db.test.find({"type":'user', 'group': {'$all': ['author']}})] articles = db.test.find({"type": "blogs", "user": {'$in': users})
c SQL :
SELECT blogs.* FROM blogs, user, usergroup, group WHERE blogs.user = user.id AND usergroup.user = user.id AND usergroup.group = group.id AND group.name = 'author';
user, d jsonb. â :
SELECT blogs.* FROM blogs, user WHERE blogs.user = user.id AND user.group ? 'author'; SELECT blogs.* FROM (SELECT * FROM test WHERE d->type = 'blogs') blogs, (SELECT * FROM test WHERE d->type = 'user') user WHERE blogs.d->user = user.id AND user.d->group ? 'author';
pipe.
db.test.aggregate([ { $match: { $or: [ {type: "blogs"}, {type: "user"} ] } }, { $project: { a: 1, blogs: { $cond: { if: { type: '$blogs'}, then: {_id:"$_id", user:"$user", article:"$article"}, else: null } }, user: { $cond: { if: { type: '$user' }, then: { _id:"$_id", group:"$group"}, else: null } } } }, { $group : { _id : { a: "$a" }, user: { $push: "$user" }, blog: { $push: "$blogs" }, } }, { $unwind : "$blog" }, { $unwind : "$user" }, { $project:{ user: "$user", article: "$blog", matches: { $eq:[ "$user._id", "$blog.user" ] } } }, { $match: { matches: true } } ])
. 7 .
, mongodb
pipeline
. , , , , , .
SQL Terms, Functions, and Concepts | MongoDB Aggregation Operators |
---|
WHERE | $match |
GROUP BY | $group |
HAVING | $match |
SELECT | $project |
ORDER BY | $sort |
LIMIT | $limit |
SUM() | $sum |
COUNT() | $sum |
join | $unwind |
.
> db.ag.aggregate([ { $match: {$or:[{type:"blogs"},{type:"user"}]} } ]) { "_id" : "gomer", "type" : "user", "group" : [ "user", "author" ] } { "_id" : "vasya", "type" : "user", "group" : [ "user" ] } { "_id" : 1, "type" : "blogs", "user" : "gomer", "article" : "aaa" } { "_id" : 2, "type" : "blogs", "user" : "vasya", "article" : "bbb" } { "_id" : 3, "type" : "blogs", "user" : "gomer", "article" : "ccc" }
$match
find()
, , .
c $project
, blogs
users
. 2.6
$cond
. blogs
users
, .
db.test.aggregate([ { $match: {$or:[ { type:"blogs"}, { type: "user"} ] } }, { $project: { a: 1, blogs: { $cond: { if: {type: '$blogs'}, then: {_id:"$_id", user:"$user", article:"$article"}, else: null } }, user: { $cond: { if: { type: '$user'}, then: {_id:"$_id", group:"$group"}, else: null } } } } ]) { "_id": "gomer", "blogs": { "_id" : "gomer" }, "user": { "_id": "gomer", "group": [ "user", "author" ] } } { "_id": "vasya", "blogs": { "_id" : "vasya" }, "user" : { "_id" : "vasya", "group": [ "user" ] } } { "_id": 1, "user": { "_id": 1 }, "blogs" : { "_id": 1, "user": "gomer", "article": "aaa" } } { "_id": 2, "user": { "_id": 2 }, "blogs" : { "_id": 2, "user": "vasya", "article": "bbb" } } { "_id": 3, "user": { "_id": 3 }, "blogs" : { "_id": 3, "user": "gomer", "article": "ccc" } }
:
...{ $group : { _id : { a: "$a" }, user: { $push: "$user" }, blog: { $push: "$blogs" }, } }... { "_id" : { "a" : null }, "user": [ { "_id": "gomer", "group": [ "user", "author" ] }, { "_id": "vasya", "group": [ "user" ] }, { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ], "blog": [ { "_id": "gomer" }, { "_id": "vasya" }, { "_id": 1, "user": "gomer", "article": "aaa" }, { "_id": 2, "user": "vasya", "article": "bbb" }, { "_id": 3, "user": "gomer", "article": "ccc"} ] }
$unwind ....{ $unwind : "$blog" }, { $unwind : "$user" } .... { "_id": { "a":null }, "user": { "_id": "gomer", "group": [ "user", "author" ] }, "blog": { "_id": "gomer" } } { "_id": { "a":null }, "user": { "_id": "vasya", "group": [ "user" ] }, "blog" : { "_id": "gomer" } } { "_id": { "a":null }, "user": { "_id": 1 }, "blog": { "_id" : "gomer" } } { "_id": { "a" : null }, "user" : { "_id" : 2 }, "blog" : { "_id" : "gomer" } } { "_id": { "a" : null }, "user" : { "_id" : 3 }, "blog" : { "_id" : "gomer" } } { "_id": { "a": null }, "user": { "_id": "gomer", "group" : [ "user", "author" ] }, "blog": { "_id": "vasya"}} { "_id": { "a" : null }, "user" : { "_id" : "vasya", "group" : [ "user" ] }, "blog" : { "_id" : "vasya" } } { "_id": { "a" : null }, "user" : { "_id" : 1 }, "blog" : { "_id" : "vasya" } } { "_id": { "a" : null }, "user" : { "_id" : 2 }, "blog" : { "_id" : "vasya" } } { "_id": { "a" : null }, "user" : { "_id" : 3 }, "blog" : { "_id" : "vasya" } } { "_id": { "a" : null }, "user" : { "_id" : "gomer", "group" : [ "user", "author" ] }, "blog" : { "_id" : 1, "user": "gomer", "article" : "aaa" } } { "_id": { "a" : null }, "user": { "_id" "vasya", "group": [ "user" ] }, "blog": { "_id": 1, "user": "gomer", "article": "aaa" } } { "_id": { "a" : null }, "user" : { "_id" : 1 }, "blog" : { "_id" : 1, "user" : "gomer", "article" : "aaa" } } { "_id" : { "a" : null }, "user" : { "_id" : 2 }, "blog" : { "_id" : 1, "user" : "gomer", "article" : "aaa" } } { "_id": { "a" : null }, "user" : { "_id" : 3 }, "blog" : { "_id" : 1, "user" : "gomer", "article" : "aaa" } } { "_id": { "a" : null }, "user" : { "_id" : "gomer", "group" : [ "user", "author" ] }, "blog" : { "_id" : 2, "user": "vasya", "article" : "bbb" } } { "_id": { "a" : null }, "user" : { "_id" : "vasya", "group" : [ "user" ] }, "blog" : { "_id" : 2, "user" : "vasya", "article" : "bbb" } } { "_id": { "a" : null }, "user" : { "_id" : 1 }, "blog" : { "_id" : 2, "user" : "vasya", "article" : "bbb" } } { "_id": { "a" : null }, "user" : { "_id" : 2 }, "blog" : { "_id" : 2, "user" : "vasya", "article" : "bbb" } } { "_id": { "a" : null }, "user" : { "_id" : 3 }, "blog" : { "_id" : 2, "user" : "vasya", "article" : "bbb" } }
, $eq:[ "$user._id", "$blog.user" ]
"user" : { "_id" : 2 }
"blog" : { "user" : "vasya" }
.
...{ $project:{ user:"$user", article:"$blog", matches:{ $eq:[ "$user._id", "$blog.user" ] } } } .....
{ "_id" : { "a" : null }, "user" : { "_id" : 1 }, "article" : { "_id" : 1, "user" : "gomer", "article" : "aaa" }, "matches" : false } { "_id" : { "a" : null }, "user" : { "_id" : 2 }, "article" : { "_id" : 1, "user" : "gomer", "article" : "aaa" }, "matches" : false } { "_id" : { "a" : null }, "user" : { "_id" : 3 }, "article" : { "_id" : 1, "user" : "gomer", "article" : "aaa" }, "matches" : false } { "_id" : { "a" : null }, "user" : { "_id" : "gomer", "group" : [ "user", "author" ] }, "article" : { "_id" : 2, "user" : "vasya", "article" : "bbb" }, "matches" : false } { "_id" : { "a" : null }, "user" : { "_id" : "vasya", "group" : [ "user" ] }, "article" : { "_id" : 2, "user" : "vasya", "article" : "bbb" }, "matches" : true } { "_id" : { "a" : null }, "user" : { "_id" : 1 }, "article" : { "_id" : 2, "user" : "vasya", "article" : "bbb" }, "matches" : false } { "_id" : { "a" : null }, "user" : { "_id" : 2 }, "article" : { "_id" : 2, "user" : "vasya", "article" : "bbb" }, "matches" : false } { "_id" : { "a" : null }, "user" : { "_id" : 3 }, "article" : { "_id" : 2, "user" : "vasya", "article" : "bbb" }, "matches" : false } Type "it" for more
:
{ $match: { matches:true } }
{ "_id": { "a": null }, "user": { "_id": "gomer", "group": [ "user", "author" ] }, "article": { "_id": 1, "user": "gomer", "article": "aaa" }, "matches": true }
{ "_id": { "a": null }, "user": { "_id": "vasya", "group": [ "user" ] }, "article": { "_id": 2, "user": "vasya", "article": "bbb" }, "matches": true }
{ "_id": { "a": null }, "user": { "_id": "gomer", "group": [ "user", "author" ] }, "article": { "_id": 3, "user": "gomer", "article": "ccc" }, "matches": true }
, .
, .
, pipeline
.
7.
, , . :
, Mongodb
, â . , , , .

.
:
{ _id:1, type:"blog", title:{ru:"O MongoDB", en:""}, comments: [ { _id: 1, title: "one", "user": "Alex", parent: "root", child: [2, 3]}, { _id: 2, title: "two", "user": "Serg", parent: 1 }, { _id: 3, title: "two", "user": "Andrey", parent: 1 } ] }
:
{ _id: 1, type: "comment", title: "one", "user": "Alex", parent: "root", child: [ 2, 3 ] }, { _id: 2, type: "comment", title: "two", "user": "Serg", parent: 1 }, { _id: 3, type: "comment", title: "two", "user": "Andrey", parent: 1 }
.
, .
, , "" .
.
:
db.test.update( { _id: 1 }, { $pull: { child: 2 } } ) db.test.update( { _id: 1 }, { $pullAll: { child: [ 2, 3 ] } } )
:
db.test.update( { _id: 1 }, { $push: { child: 2 } } } ) db.test.update( { _id: 1 }, { $push: { child: { $each: [ 2, 3 ] } } } )
:
def getTree(docs): tree = { doc["_id"]: doc for doc in docs } for doc in docs: doc['child'] = [] for doc in docs: parent = doc["parent"] if parent != "root": tree[parent]["child"].append(doc) docs={"_id": "root", "child": [doc for doc in docs if doc['parent'] == "root" ]} return docs { _id: 1, type: "comment", title: "one", "user": "Alex", parent: "root", child: [ { _id: 2, type: "comment", title: "two", "user": "Serg", parent: 1 }, { _id: 3, type: "comment", title: "two", "user": "Andrey", parent: 1 } ] }
, , , _id
:
def count(cls): db = connect() ctr = db.test.find({'type':'goods', 'class':cls}).count() childs = db.test.find_one({'_id':cls}) for res in childs['child']: ctr += count(res) return ctr
, _id
, :
def path( id ): p = [] parent = db.test.find_one( {"_id": id }, { "parent": 1, "alias":1, "title":1}) else: path.append( ( parent['alias'], parent['title'] ) ) p += path( parent['parent'] ) return p print ( path("123") ) >>>[ ("one", " "), ("two", " ") ]
,
, { tags : { ru: ", " } }
, . { tags : [ "", "" ] }
.
, .
, , , :
{ _id: 1, title: " ", tags: [ "php", "python" ] } db.test.find({ tags: { $in: ["php", "python" ] } } )
:
- , , `python, javascript`.
- , , , , «».
- , , , .
- .
- , .
- , , , , 5 .
- , `+2` .
- .
- `10` .
- , , ( ).
dt = ( datetime.today() + timedelta( days = -5 ) ) db.test.aggregate([ { $match: { // type: "news", date: { $gt: dt }, // . vate: { $gte: 2 }, // . user: { $in: [ "alex", "pavel" ] } $and: [ // . { pub: true }, { accept: true }, // . { tags: { $in: ["php", "python" ] } } , // . { tags: { $nin: [""] } } ] }, // . { $sort: {'primary': -1, view: -1}}, // , 5 { $limit:3}, // 1 , . { $group: { '_id':'$user', 'id': {'$first':'$_id'}, 'type':{'$first':'$type'}, 'title': {'$first':'$title'}, 'content':{'$first':'$content'}, 'count':{'$first':'$count_comm'}, 'last_comm':{'$first':'$last_comm'}, 'vote':{'$first':'$vote'}, 'tags':{'$first':'$tags'} } }, // . { $project :{ '_id':'$id', 'title':1, 'content':1, 'type':1, 'count':1, 'last_comm':1, 'tags':1, 'vote':1 } } ])
db.test.aggregate([ { $match: { type: "news", date: { $gt: dt }, vate: { $gte: 2 }, user: { $in: [ "alex", "pavel" ] } $and: [ { pub: true }, { accept: true }, { tags: { $in: ["php", "python" ] } } , { tags: { $nin: [""] } } ] }, { $sort: {'primary': -1, view: -1}}, { $limit:3}, { $group: {'_id':'$user', 'id': {'$first':'$_id'}, 'type':{'$first':'$type'}, 'title': {'$first':'$title'}, 'content':{'$first':'$content'}, 'count':{'$first':'$count_comm'}, 'last_comm':{'$first':'$last_comm'}, 'vote':{'$first':'$vote'}, 'tags':{'$first':'$tags'} } }, { $project :{ '_id':'$id', 'title':1, 'content':1, 'type':1, 'count':1, 'last_comm':1, 'tags':1, 'vote':1 } } ])
, â .
-commerce Mongodb
, - â - . , , , , , , .
, - , . .
, , , -.
- ( )
- .
, , , â . , , .
().
:
- , .
- .
, , . :
cursor = db.test.find({ "type": "filters", "category": "id_category" })
, , , , .
=>
=> 15.6 , 17 .

, . . ., .
â , , â .

. , .
, , . .

, . _id .
$addToSet
.
db.test.aggregate([ // id { '$match': { type : "goods_attr", category: id_category } }, // , { '$project': { "title" : "$title.ru", 'value': "$attr.ru", 'category': "$category", '_id': 0 } }, { '$group' : { '_id': { 'category' :"$category", 'title': "$title"} , 'filters': { '$addToSet': "$value" } } }, { '$group' : { '_id' :"$_id.category", 'title':{ '$addToSet': { 'title': "$_id.title", 'filters': "$filters" } } } } ])
group :
...{ '$group' : { '_id': { 'category' :"$category", 'title': "$title"} , 'filters': { '$addToSet': "$value" } } }.... { "_id": { "category": "id", "title": " " }, "filters": [ "" ] } { "_id" : { "category" : "id", "title" : "" }, "filters" : [ " " ] } { "_id" : { "category" : "id", "title" : " " }, "filters" : [ "" ] }
group .
...{ '$group' : { '_id':"$_id.category", 'title':{'$addToSet': {'title': "$_id.title", 'filters': "$filters" }} } ...} { "_id" : "id_category", "title" : [ { "title" : " ", "filters" : [ " ", " ", " ", " " ] }, { "title" : " ", "filters" : [ "" ] }, { "title" : "", "filters" : [ " " ] }, { "title" : " ", "filters" : [ "" ] } ] }
, , . , , owner_id
_id .
db.test.aggregate([ { '$match' : { 'type' : "goods_attr", "category'':"id", '$or': [ {'title': '', 'attr': ' '}, {'title': ' ', 'attr_val': ' '} ] } }, { '$group': {'_id': "$owner_id", "attr": { '$push': "$title" }}}, { '$match': {"attr": {'$all': [ '', ' ' ] }}}, { '$project': {"_id":1 } } ])
_id .
Python
.
, , , ( â ) . , , .
ERP . , , - . , , .
python
, , .
exec
src = ''' result = 0 for i in xrange(100): result += i ''' assert '__' not in src, 'Prohibited to use symbols "__"' pr = compile(src, '<string>', mode='exec') glob = { '__builtins__':{ 'xrange':xrange } } exec(pr, glob) print glob['result']
eval
( )
src = 'max(5,7,3)' glob = { '__builtins__':{ 'max':max } } assert '__' not in src, 'Prohibited to use symbols "__"' print ( eval(src, glob) )
â :
assert '__' not in src, 'Prohibited to use symbols "__"'