简述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  

posted @ 2012-05-07 09:26  timest  阅读(327)  评论(0编辑  收藏  举报