简述MongoDB的 CRUD
简述MongoDB的 CRUD (Create , Retrieve, Update, Delete)!
图书馆来了一批新书,馆长是个mogao(摩高)的fans,因其商标和MongoDB酷似,所以数据库也选择了mongo 。碰巧目前整个水专就timest一人在研究mongo,故馆长请求timest帮忙录入一批新书。
创建(Create):
timest 拿起第一本书,很巧,是一本python的书,眼前一亮,立马用这门语言把这本书录入进去:
单本插入:
from pymongo import Connection import datetime conn = Connection() db = conn['bookshop'] #下面的代码以上四句省略 book = {'bookname':'<Head First Python>', 'money':30, 'Tags':['comp','python','geek'], 'insert_date':datetime.datetime.utcnow()} books = db.books books.insert(book)
插完这本书,timest抬头看了看桌上,还有近百本书,如果每一本书都这么输入,麻烦不说,Mongo处理的效率也低,timest首先想到批量处理:
一次批量插入只是单个Tcp请求,也就是避免了多个请求带来的开销!由于无需处理大量的消息头,这样能够减少插入时间。要知道当单个文档发送至数据库时,会有一个头部消息,告诉数据库对指定的集合做插入操作。用批量插入的话,数据库就不用一遍又一遍地处理每一个文档的这种消息了。
因为书实在多,作为梦想当一名Geek的timest,不会把时间花在这种事情上。timest给了某学妹5000块,让她帮忙帮数据录了进去。在学妹录入数据的时间了,timest创造出的价值是5000的好几倍!
book_list = [ {'bookname':'<Life is cool>', 'money':300, 'Tags':['life','style'], 'insert_date':datetime.datetime.utcnow()}, {'bookname':'<Linux System Programming>', 'money':30, 'Tags':['comp','linux','geek'], 'insert_date':datetime.datetime.utcnow()} ] books = db.books books.insert(book_list) #mongo在新增数据的时候,不会执行这些数据,所以sql里的注入在mongo里,根本无法实现
因为经常抓虫练就一双好眼力的timest发现学妹不小心把《life is cool》这本书的价格多打了一个0.打电话给她她正和男朋友培养感情,算了,只能自己来。
修改(Update):
db.books.update({'bookname':'<Life is cool>'}, {'$set':{'money':30}})
学妹电话打来开始撒娇,timest意识到出有问题了,果然,有一本书因为学妹当初在录数据时想着男友,忘了是否已经录入。伸手不打笑脸人,何况对方还是会撒娇的美女学妹呢。作为Geek界颇具男人风范的timest 笑着说到:这事虽然很棘手,但是有学长在,没事,学妹你玩得开心点。 随即挂掉电话。一脸狡诈的笑容悄悄浮上timest的脸上,timest轻松往后靠在椅子上,成135度,翘着二郎腿,“切,多大的事,看把这妹子急得……”!
db.books.update({'bookname':'<Life not cool>'}, {'$set':{'money':30,'Tags':['life','style'],'insert_date':datetime.datetime.utcnow()}}},True)
就当timest掏出一瓶酒想来点微醺之醉时,突然接到馆长电话,说《Life is Cool》这本书其实是挂羊头卖狗肉,封面如此,但其内容是宣扬邪门歪道的宗教宣扬,作为基督徒的timest,怎么能容忍这些歪教的存在。立马操起python刀,挥刀即下,刀光剑影。
删除(Delete):
db.books.remove({'bookname':'<Life is cool>'})
这样,timest可以好好喝酒了。 timest有个癖好,喜欢喝酒的时候看看自己的劳动成果。
检索(Recrieve)
print list( db.books.find() ) # 检索全部 print list( db.books.find( {'money':30} ) ) # 指定检索
大片的数据让timest感到心烦,timest向来对钱没有兴趣。 这个时候他只想看看书名:
print list(db.books.find({},{'bookname':1,'_id':0})) #第二个参数也是键值对,如果想看bookname就设置1,不想看就0,默认0,但是_id是mongo为每条数据自动生成的。检索的时候也会出现,所以设置成0
timest@timest-Lenovo:~$ python book.py [{u'bookname': u'<Head First Python>'}, {u'bookname': u'<Linux System Programming>'}, {u'bookname': u'<Life not cool>'}]
喝完酒,timest突然对数字感兴趣了,他想看看价格在30-40之间的书有几本:
print list(db.books.find({ 'money':{'$gte':30,'$lte':40} },{'bookname':1,'_id':0}))
timest@timest-Lenovo:~$ python book.py [{u'bookname': u'<Head First Python>'}, {u'bookname': u'<Linux System Programming>'}, {u'bookname': u'<Life not cool>'}]
查询在今天以前录入的书籍:
now = datetime.datetime.utcnow() #改成任何你想要的时间 print list(db.books.find({ 'insert_date':{'$lt':now} },{'bookname':1,'_id':0}))
$lt $lte $gt $gte 分别对应 : < , <= ,> , >= !
timest有想查查价格是 30 35 或40的书:
print list(db.books.find({ 'money':{'$in':[30, 35, 40]} },{'bookname':1,'_id':0}))
PS:曾经学SQL,where语句要是支持正则那多好啊!如今,Mongo 支持正则!学了多门语言,发现mongo处理数据的写法 比 那些 select from update set 等等更容易令我接受! 我还要继续深入下去。有兴趣的一起讨论讨论!
更多用法:http://api.mongodb.org/python/current/api/pymongo/collection.html