今兒,接到老的的要求,要把新功能的數據存放在Mongo里。雖然一直都有聽過Mango的鼎鼎大名,但是那也只是見過沒用過,跟個小白沒啥區別。在加上功能急需,沒辦法只能趕鴨子上架先上再說。下面這篇就是我趕緊上手Mongo的心得體會。只是最簡單的用法。。。。
說下MongoEngine,這個是在pymongo的基礎上封裝的類似於ORM一樣的模塊,讓我們能快速的上手操作Mango。里面的操作和ORM基本類似,只是些許的區別需要注意。廢話不多說了,是時候表演真正的技術了。
在setting里配置數據庫
在model里建立模型類,模型類建立以后不用makemigrations和migrate同步,直接就可以使用。
# -*- coding: utf-8 -*- import mongoengine class OrderWarningInfo(mongoengine.Document): order_id = mongoengine.StringField(max_length=32, blank=True, null=True) mac = mongoengine.StringField(max_length=32, blank=True, null=True) number = mongoengine.StringField(max_length=32, blank=True, null=True) temperature = mongoengine.StringField(max_length=32, blank=True, null=True) scan_location = mongoengine.StringField(max_length=32, blank=True, null=True) event = mongoengine.StringField(blank=True) scan_time = mongoengine.DateTimeField(null=True, blank=True) status = mongoengine.StringField(blank=True, null=True ) is_finish = mongoengine.StringField(blank=True)
在view里想用ORM那樣的使用就可以了。
warninginfos = OrderWarningInfo.objects.all().order_by("-scan_time") warninginfos = OrderWarningInfo.objects.filter(name=name,event=event).order_by("-scan_time")
OrderWarningInfo.objects.filter(name=name,event=event).first()
OrderWarningInfo.objects.filter(name=name,event=event).distinct("name")
寫在最后的一些區別。
1. MongoEngine里沒用指定多個返回字段這一說(也就是說.values()這個方法不能用)。
2. 對於去重的使用也少許不同。ORM里.distinct(). MongoEngine里.distint("字段名")表示只顯示這一個字段並去重,返回一個list。
3.用_id來查詢數據。因為自動生成的_id是個ObjectId對象,所以如果你傳過來的不是ObjectId,那么久不能直接查詢。
正確的姿勢如下
#pymongo的版本號大於2.2,使用下面的語句導入ObjectId from bson.objectid import ObjectId ## #pymongo的版本號小於2.2,使用下面的語句導入ObjectId from pymongo.objectid import ObjectId event_id = "5c0a33b0c3cdb283d2c56817" #__raw__允許MongoEngine使用原生mongo語句查詢 warninginfos = OrderWarningInfo.objects.filter(__raw__={'_id': ObjectId("%s" % event_id)}).update(is_finish = "2")
工作中用到的不多,占時只能寫出來一些最簡單最基礎的東西。MongoDB是門大學問,以后有機會還會繼續整理關於Mango的文章。