摘要:數(shù)據(jù)庫查詢對(duì)象有一個(gè)屬性,用來訪問在數(shù)據(jù)庫中跟這個(gè)類有關(guān)的對(duì)象。使用方法在數(shù)據(jù)不存在的時(shí)候會(huì)返回默認(rèn)查詢默認(rèn)情況下,的屬性返回一個(gè)一個(gè)對(duì)象,它并沒有進(jìn)行任何篩選和過濾,它返回的是所有的數(shù)據(jù)對(duì)象。它返回結(jié)果是函數(shù)的返回值。
數(shù)據(jù)庫查詢
Document 對(duì)象有一個(gè) objects 屬性,用來訪問在數(shù)據(jù)庫中跟這個(gè)類有關(guān)的對(duì)象。這個(gè) objects 屬性其實(shí)是一個(gè)QuerySetManager ,它會(huì)創(chuàng)建和返回一個(gè)新的 QuerySet 對(duì)象的訪問。這個(gè) QuerySet 對(duì)象可以從數(shù)據(jù)庫中遍歷獲取的文檔:
# Prints out the names of all the users in the database for user in User.objects: print user.name過濾查詢
可以通過調(diào)用 QuerySet 對(duì)象的關(guān)鍵字參數(shù)來對(duì)數(shù)據(jù)查詢進(jìn)行過濾,關(guān)鍵字查詢中的鍵和你想要查詢的Document 中的字段一致:
# This will return a QuerySet that will only iterate over users whose # "country" field is set to "uk" uk_users = User.objects(country="uk")
對(duì)于內(nèi)嵌document的字段可以使用 __ 來代替對(duì)象屬性訪問語法中的 . 進(jìn)行訪問:
# This will return a QuerySet that will only iterate over pages that have # been written by a user whose "country" field is set to "uk" uk_pages = Page.objects(author__country="uk")查詢操作符
在查詢中也可以使用操作符,只要將其加在關(guān)鍵字的雙下劃線之后即可:
# Only find users whose age is 18 or less young_users = Users.objects(age__lte=18)
可用的運(yùn)算符如下:
ne?– 不等于≠
lt?– 小于<
lte?– 小于等于≤
gt?– 大于>
gte?– 大于等于 ≥
not?– 否定一個(gè)標(biāo)準(zhǔn)的檢查,需要用在其他操作符之前(e.g.?Q(age__not__mod=5))
in?– 值在 list 中
nin?– 值不在 list 中
mod?–?value?%?x?==?y, 其中?x?和 y?為給定的值
all?– list 里面所有的值
size?– 數(shù)組的大小
exists?– 存在這個(gè)值
字符串查詢以下操作符可以快捷的進(jìn)行正則查詢:
exact?– 字符串型字段完全匹配這個(gè)值
iexact?– 字符串型字段完全匹配這個(gè)值(大小寫敏感)
contains?– 字符串字段包含這個(gè)值
icontains?– 字符串字段包含這個(gè)值(大小寫敏感)
startswith?– 字符串字段由這個(gè)值開頭
istartswith?– 字符串字段由這個(gè)值開頭(大小寫敏感)
endswith?– 字符串字段由這個(gè)值結(jié)尾
iendswith?– 字符串字段由這個(gè)值結(jié)尾(大小寫敏感)
match?– 執(zhí)行 $elemMatch 操作,所以你可以使用一個(gè)數(shù)組中的 document 實(shí)例
地理查詢PASS
列表查詢對(duì)于大多數(shù)字段,這種語法會(huì)查詢出那些字段與給出的值相匹配的document,但是當(dāng)一個(gè)字段引用 ListField 的時(shí)候,而只會(huì)提供一條數(shù)據(jù),那么包含這條數(shù)據(jù)的就會(huì)被匹配上:
class Page(Document): tags = ListField(StringField()) # This will match all pages that have the word "coding" as an item in the # "tags" list Page.objects(tags="coding")原始查詢
你可以通過 __raw__ 參數(shù)來使用一個(gè)原始的 PyMongo 語句來進(jìn)行查詢,這樣可以進(jìn)行原始的完整查詢:
Page.objects(__raw__={"tags": "coding"})限制和跳過結(jié)果
就像傳統(tǒng)的ORM一樣,你有時(shí)候需要限制返回的結(jié)果的數(shù)量,或者需要跳過一定數(shù)量的結(jié)果。QuerySet 里面可以使用 limit() 和 skip() 這兩個(gè)方法來實(shí)現(xiàn),但是更推薦使用數(shù)組切割的語法:
# Only the first 5 people users = User.objects[:5] # All except for the first 5 people users = User.objects[5:] # 5 users, starting from the 11th user found users = User.objects[10:15]
你可以指定讓查詢返回一個(gè)結(jié)果。如果這個(gè)條在數(shù)據(jù)庫中不存在,那么會(huì)引發(fā) IndexError 錯(cuò)誤 。使用 first() 方法在數(shù)據(jù)不存在的時(shí)候會(huì)返回 None:
>>> # Make sure there are no users >>> User.drop_collection() >>> User.objects[0] IndexError: list index out of range >>> User.objects.first() == None True >>> User(name="Test User").save() >>> User.objects[0] == User.objects.first() True默認(rèn)Document 查詢
默認(rèn)情況下,Document的objects 屬性返回一個(gè)一個(gè) QuerySet 對(duì)象,它并沒有進(jìn)行任何篩選和過濾,它返回的是所有的數(shù)據(jù)對(duì)象。這一點(diǎn)可以通過給一個(gè) document 定義一個(gè)方法來修改 一個(gè)queryset 。這個(gè)方法需要兩參數(shù)__doc_cls 和 queryset 。第一個(gè)參數(shù)是定義這個(gè)方法的 Document 類名(從這個(gè)意義上來說,這個(gè)方法像是一個(gè) classmethod() 而不是一般的方法),第二個(gè)參數(shù)是初始化的 queryset。這個(gè)方法需要使用 queryset_manager()來裝飾來它,使得它被認(rèn)可。
class BlogPost(Document): title = StringField() date = DateTimeField() @queryset_manager def objects(doc_cls, queryset): # This may actually also be done by defining a default ordering for # the document, but this illustrates the use of manager methods return queryset.order_by("-date")
你不用調(diào)用 objects 方法,你可以自定義更多的管理方法,例如:
class BlogPost(Document): title = StringField() published = BooleanField() @queryset_manager def live_posts(doc_cls, queryset): return queryset.filter(published=True) BlogPost(title="test1", published=False).save() BlogPost(title="test2", published=True).save() assert len(BlogPost.objects) == 2 assert len(BlogPost.live_posts()) == 1自定義 QuerySets
當(dāng)你想自己定義一些方法來過濾 document 的時(shí)候,繼承 QuerySet 類對(duì)你來說就是個(gè)好的方法。為了在 document 里面使用一個(gè)自定義的 QuerySet 類,你可以在 document 里的 meta 字典里設(shè)置 queryset_class 的值來實(shí)現(xiàn)它。
class AwesomerQuerySet(QuerySet): def get_awesome(self): return self.filter(awesome=True) class Page(Document): meta = {"queryset_class": AwesomerQuerySet} # To call: Page.objects.get_awesome()Aggregation 聚合
MongoDB 提供了開箱即用的聚合方法,但沒有 RDBMS 提供的那樣多。MongoEngine 提供了一個(gè)包裝過的內(nèi)置的方法,同時(shí)自身提供了一些方法,它實(shí)現(xiàn)了在數(shù)據(jù)庫服務(wù)上執(zhí)行的 Javascript 代碼的功能。
結(jié)果計(jì)數(shù)就像限制和跳過結(jié)果一樣, QuerySet 對(duì)象提供了用來計(jì)數(shù)的方法 - count(),不過還有一個(gè)更 Pythonic 的方法來實(shí)現(xiàn):
num_users = len(User.objects)更多功能
當(dāng)你想為 document 的特定的字段的數(shù)量計(jì)數(shù)的時(shí)候,可以使用 sum():
yearly_expense = Employee.objects.sum("salary")
當(dāng)你想求某個(gè)字段的平均值的時(shí)候,可以使用 average():
mean_age = User.objects.average("age")
MongoEngine 提供了一個(gè)方法來獲取一個(gè)在集合里 item 的頻率 - item_frequencies()。下面一個(gè)例子可以生成 tag-clouds:
class Article(Document): tag = ListField(StringField()) # After adding some tagged articles... tag_freqs = Article.objects.item_frequencies("tag", normalize=True) from operator import itemgetter top_tags = sorted(tag_freqs.items(), key=itemgetter(1), reverse=True)[:10]查詢效率和性能
PASS
高級(jí)查詢有時(shí)候使用關(guān)鍵字參數(shù)返回的 QuerySet 不能完全滿足你的查詢需要。例如有時(shí)候你需要將約束條件進(jìn)行and,or 的操作。你可以使用 MongoEngine 提供的 Q 類來實(shí)現(xiàn),一個(gè) Q 類代表了一個(gè)查詢的一部分,里面的參數(shù)設(shè)置與你查詢document 的時(shí)候相同。建立一個(gè)復(fù)雜查詢的時(shí)候,你需要用 & 或 | 操作符將 Q 對(duì)象連結(jié)起來。例如:
from mongoengine.queryset.visitor import Q # Get published posts Post.objects(Q(published=True) | Q(publish_date__lte=datetime.now())) # Get top posts Post.objects((Q(featured=True) & Q(hits__gte=1000)) | Q(hits__gte=5000))Atomic updates(原子更新)
MongoDB 文檔 可以通過QuerySet 上的 update_one()、update()、modify() 方法自動(dòng)更新。下面幾種操作符可以被用到這幾種方法上:
set?– 設(shè)置成一個(gè)指定的值
unset?– 刪除一個(gè)指定的值
inc?– 將值加上一個(gè)給定的數(shù)
dec?– 將值減去一個(gè)給定的數(shù)
push?– 在 list 中添加一個(gè)值
push_all?– 在 list 中添加一個(gè)值
pop?– 移除list 的第一項(xiàng)或最后一項(xiàng)(根據(jù) pop__
pull?– 從 list 里面移除一個(gè)值
pull_all?– 從 list 里面移除個(gè)值
add_to_set?– 當(dāng)要添加的值不在 list 中時(shí),添加這個(gè)值
原子更新的語法類似于查詢語法,區(qū)別在于修飾操作符位于字段之前,而不是之后:
>>> post = BlogPost(title="Test", page_views=0, tags=["database"]) >>> post.save() >>> BlogPost.objects(id=post.id).update_one(inc__page_views=1) >>> post.reload() # the document has been changed, so we need to reload it >>> post.page_views 1 >>> BlogPost.objects(id=post.id).update_one(set__title="Example Post") >>> post.reload() >>> post.title "Example Post" >>> BlogPost.objects(id=post.id).update_one(push__tags="nosql") >>> post.reload() >>> post.tags ["database", "nosql"]
如果沒有修飾操作符,則默認(rèn)為$set:
BlogPost.objects(id=post.id).update(title="Example Post") BlogPost.objects(id=post.id).update(set__title="Example Post")服務(wù)器端 JavaScript 執(zhí)行
可以寫 Javascript函數(shù),然后發(fā)送到服務(wù)器來執(zhí)行。它返回結(jié)果是 Javascript 函數(shù)的返回值。這個(gè)功能是通過QuerySet()對(duì)象的exec_js() 方法實(shí)現(xiàn)。傳遞一個(gè)包含一個(gè)Javascript函數(shù)的字符串作為第一個(gè)參數(shù)。
其余位置的參數(shù)的名字字段將作為您的Javascript函數(shù)的參數(shù)傳遞過去。
在 JavaScript 函數(shù)范圍中,一些變量可用:
collection?– 對(duì)應(yīng)使用的 Document 類的集合的名稱
query?– 一個(gè)?QuerySet 對(duì)象
options?– 一個(gè)對(duì)象,它包含要傳遞給 exec_js() 函數(shù)的一些參數(shù)
def sum_field(document, field_name, include_negatives=True): code = """ function(sumField) { var total = 0.0; db[collection].find(query).forEach(function(doc) { var val = doc[sumField]; if (val >= 0.0 || options.includeNegatives) { total += val; } }); return total; } """ options = {"includeNegatives": include_negatives} return document.objects.exec_js(code, field_name, **options)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/38332.html
摘要:數(shù)據(jù)庫查詢對(duì)象有一個(gè)屬性,用來訪問在數(shù)據(jù)庫中跟這個(gè)類有關(guān)的對(duì)象。使用方法在數(shù)據(jù)不存在的時(shí)候會(huì)返回默認(rèn)查詢默認(rèn)情況下,的屬性返回一個(gè)一個(gè)對(duì)象,它并沒有進(jìn)行任何篩選和過濾,它返回的是所有的數(shù)據(jù)對(duì)象。它返回結(jié)果是函數(shù)的返回值。 數(shù)據(jù)庫查詢 Document 對(duì)象有一個(gè) objects 屬性,用來訪問在數(shù)據(jù)庫中跟這個(gè)類有關(guān)的對(duì)象。這個(gè) objects 屬性其實(shí)是一個(gè)QuerySetManage...
摘要:今天整理了一下在項(xiàng)目中如何使用環(huán)境如下第一步在中配置和配置如下可以同時(shí)使用和數(shù)據(jù)庫引擎你要存儲(chǔ)數(shù)據(jù)的庫名,事先要?jiǎng)?chuàng)建之?dāng)?shù)據(jù)庫用戶名密碼主機(jī)數(shù)據(jù)庫使用的端口連接中數(shù)據(jù)庫名稱為的數(shù)據(jù)庫第二步向中插入數(shù)據(jù)插入類型數(shù)據(jù)插入數(shù)據(jù)格式為插入含有的數(shù)據(jù)用 今天整理了一下在django項(xiàng)目中如何使用mongodb, 環(huán)境如下:ubuntu18.04, django2.0.5, drf3.9, mong...
摘要:今天整理了一下在項(xiàng)目中如何使用環(huán)境如下第一步在中配置和配置如下可以同時(shí)使用和數(shù)據(jù)庫引擎你要存儲(chǔ)數(shù)據(jù)的庫名,事先要?jiǎng)?chuàng)建之?dāng)?shù)據(jù)庫用戶名密碼主機(jī)數(shù)據(jù)庫使用的端口連接中數(shù)據(jù)庫名稱為的數(shù)據(jù)庫第二步向中插入數(shù)據(jù)插入類型數(shù)據(jù)插入數(shù)據(jù)格式為插入含有的數(shù)據(jù)用 今天整理了一下在django項(xiàng)目中如何使用mongodb, 環(huán)境如下:ubuntu18.04, django2.0.5, drf3.9, mong...
摘要:查詢數(shù)據(jù)查詢所有數(shù)據(jù)使用方法查詢滿足某些條件的數(shù)據(jù)其中,方法會(huì)取出滿足條件的第條記錄。本文由發(fā)表于個(gè)人博客,采用自由轉(zhuǎn)載保持署名非商用禁止演繹協(xié)議發(fā)布。非商業(yè)轉(zhuǎn)載請(qǐng)注明作者及出處。本文標(biāo)題為插件系列本文鏈接為更多閱讀 簡介 MongoDB 是一個(gè)文檔型數(shù)據(jù)庫,是 NoSQL (not only SQL) 的一種,具有靈活、易擴(kuò)展等諸多優(yōu)點(diǎn),受到許多開發(fā)者的青睞。MongoEngine ...
摘要:環(huán)境或使用以下命令安裝會(huì)出現(xiàn)以下錯(cuò)誤定為中的錯(cuò)誤行是在讀取文件時(shí)發(fā)生錯(cuò)誤,此文件為,其為幫助說明文檔。粗暴一點(diǎn),將其中的內(nèi)容刪除。上下載源碼包。運(yùn)行如下命令安裝 環(huán)境: windows 10、python 3.5、flask-mongoengine 0.8.2或0.9.0 使用以下命令安裝 flask-mongoengine pip install flask-mongoengine ...
閱讀 2764·2021-11-22 14:45
閱讀 915·2021-10-15 09:41
閱讀 1074·2021-09-27 13:35
閱讀 3698·2021-09-09 11:56
閱讀 2641·2019-08-30 13:03
閱讀 3203·2019-08-29 16:32
閱讀 3312·2019-08-26 13:49
閱讀 779·2019-08-26 10:35