摘要:數據庫查詢對象有一個屬性,用來訪問在數據庫中跟這個類有關的對象。使用方法在數據不存在的時候會返回默認查詢默認情況下,的屬性返回一個一個對象,它并沒有進行任何篩選和過濾,它返回的是所有的數據對象。它返回結果是函數的返回值。
數據庫查詢
Document 對象有一個 objects 屬性,用來訪問在數據庫中跟這個類有關的對象。這個 objects 屬性其實是一個QuerySetManager ,它會創建和返回一個新的 QuerySet 對象的訪問。這個 QuerySet 對象可以從數據庫中遍歷獲取的文檔:
# Prints out the names of all the users in the database for user in User.objects: print user.name過濾查詢
可以通過調用 QuerySet 對象的關鍵字參數來對數據查詢進行過濾,關鍵字查詢中的鍵和你想要查詢的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")
對于內嵌document的字段可以使用 __ 來代替對象屬性訪問語法中的 . 進行訪問:
# 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")查詢操作符
在查詢中也可以使用操作符,只要將其加在關鍵字的雙下劃線之后即可:
# Only find users whose age is 18 or less young_users = Users.objects(age__lte=18)
可用的運算符如下:
ne?– 不等于≠
lt?– 小于<
lte?– 小于等于≤
gt?– 大于>
gte?– 大于等于 ≥
not?– 否定一個標準的檢查,需要用在其他操作符之前(e.g.?Q(age__not__mod=5))
in?– 值在 list 中
nin?– 值不在 list 中
mod?–?value?%?x?==?y, 其中?x?和 y?為給定的值
all?– list 里面所有的值
size?– 數組的大小
exists?– 存在這個值
字符串查詢以下操作符可以快捷的進行正則查詢:
exact?– 字符串型字段完全匹配這個值
iexact?– 字符串型字段完全匹配這個值(大小寫敏感)
contains?– 字符串字段包含這個值
icontains?– 字符串字段包含這個值(大小寫敏感)
startswith?– 字符串字段由這個值開頭
istartswith?– 字符串字段由這個值開頭(大小寫敏感)
endswith?– 字符串字段由這個值結尾
iendswith?– 字符串字段由這個值結尾(大小寫敏感)
match?– 執行 $elemMatch 操作,所以你可以使用一個數組中的 document 實例
地理查詢PASS
列表查詢對于大多數字段,這種語法會查詢出那些字段與給出的值相匹配的document,但是當一個字段引用 ListField 的時候,而只會提供一條數據,那么包含這條數據的就會被匹配上:
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__ 參數來使用一個原始的 PyMongo 語句來進行查詢,這樣可以進行原始的完整查詢:
Page.objects(__raw__={"tags": "coding"})限制和跳過結果
就像傳統的ORM一樣,你有時候需要限制返回的結果的數量,或者需要跳過一定數量的結果。QuerySet 里面可以使用 limit() 和 skip() 這兩個方法來實現,但是更推薦使用數組切割的語法:
# 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]
你可以指定讓查詢返回一個結果。如果這個條在數據庫中不存在,那么會引發 IndexError 錯誤 。使用 first() 方法在數據不存在的時候會返回 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默認Document 查詢
默認情況下,Document的objects 屬性返回一個一個 QuerySet 對象,它并沒有進行任何篩選和過濾,它返回的是所有的數據對象。這一點可以通過給一個 document 定義一個方法來修改 一個queryset 。這個方法需要兩參數__doc_cls 和 queryset 。第一個參數是定義這個方法的 Document 類名(從這個意義上來說,這個方法像是一個 classmethod() 而不是一般的方法),第二個參數是初始化的 queryset。這個方法需要使用 queryset_manager()來裝飾來它,使得它被認可。
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")
你不用調用 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
當你想自己定義一些方法來過濾 document 的時候,繼承 QuerySet 類對你來說就是個好的方法。為了在 document 里面使用一個自定義的 QuerySet 類,你可以在 document 里的 meta 字典里設置 queryset_class 的值來實現它。
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 提供了一個包裝過的內置的方法,同時自身提供了一些方法,它實現了在數據庫服務上執行的 Javascript 代碼的功能。
結果計數就像限制和跳過結果一樣, QuerySet 對象提供了用來計數的方法 - count(),不過還有一個更 Pythonic 的方法來實現:
num_users = len(User.objects)更多功能
當你想為 document 的特定的字段的數量計數的時候,可以使用 sum():
yearly_expense = Employee.objects.sum("salary")
當你想求某個字段的平均值的時候,可以使用 average():
mean_age = User.objects.average("age")
MongoEngine 提供了一個方法來獲取一個在集合里 item 的頻率 - item_frequencies()。下面一個例子可以生成 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
高級查詢有時候使用關鍵字參數返回的 QuerySet 不能完全滿足你的查詢需要。例如有時候你需要將約束條件進行and,or 的操作。你可以使用 MongoEngine 提供的 Q 類來實現,一個 Q 類代表了一個查詢的一部分,里面的參數設置與你查詢document 的時候相同。建立一個復雜查詢的時候,你需要用 & 或 | 操作符將 Q 對象連結起來。例如:
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() 方法自動更新。下面幾種操作符可以被用到這幾種方法上:
set?– 設置成一個指定的值
unset?– 刪除一個指定的值
inc?– 將值加上一個給定的數
dec?– 將值減去一個給定的數
push?– 在 list 中添加一個值
push_all?– 在 list 中添加一個值
pop?– 移除list 的第一項或最后一項(根據 pop__
pull?– 從 list 里面移除一個值
pull_all?– 從 list 里面移除個值
add_to_set?– 當要添加的值不在 list 中時,添加這個值
原子更新的語法類似于查詢語法,區別在于修飾操作符位于字段之前,而不是之后:
>>> 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"]
如果沒有修飾操作符,則默認為$set:
BlogPost.objects(id=post.id).update(title="Example Post") BlogPost.objects(id=post.id).update(set__title="Example Post")服務器端 JavaScript 執行
可以寫 Javascript函數,然后發送到服務器來執行。它返回結果是 Javascript 函數的返回值。這個功能是通過QuerySet()對象的exec_js() 方法實現。傳遞一個包含一個Javascript函數的字符串作為第一個參數。
其余位置的參數的名字字段將作為您的Javascript函數的參數傳遞過去。
在 JavaScript 函數范圍中,一些變量可用:
collection?– 對應使用的 Document 類的集合的名稱
query?– 一個?QuerySet 對象
options?– 一個對象,它包含要傳遞給 exec_js() 函數的一些參數
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)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38332.html
摘要:數據庫查詢對象有一個屬性,用來訪問在數據庫中跟這個類有關的對象。使用方法在數據不存在的時候會返回默認查詢默認情況下,的屬性返回一個一個對象,它并沒有進行任何篩選和過濾,它返回的是所有的數據對象。它返回結果是函數的返回值。 數據庫查詢 Document 對象有一個 objects 屬性,用來訪問在數據庫中跟這個類有關的對象。這個 objects 屬性其實是一個QuerySetManage...
摘要:今天整理了一下在項目中如何使用環境如下第一步在中配置和配置如下可以同時使用和數據庫引擎你要存儲數據的庫名,事先要創建之數據庫用戶名密碼主機數據庫使用的端口連接中數據庫名稱為的數據庫第二步向中插入數據插入類型數據插入數據格式為插入含有的數據用 今天整理了一下在django項目中如何使用mongodb, 環境如下:ubuntu18.04, django2.0.5, drf3.9, mong...
摘要:今天整理了一下在項目中如何使用環境如下第一步在中配置和配置如下可以同時使用和數據庫引擎你要存儲數據的庫名,事先要創建之數據庫用戶名密碼主機數據庫使用的端口連接中數據庫名稱為的數據庫第二步向中插入數據插入類型數據插入數據格式為插入含有的數據用 今天整理了一下在django項目中如何使用mongodb, 環境如下:ubuntu18.04, django2.0.5, drf3.9, mong...
摘要:查詢數據查詢所有數據使用方法查詢滿足某些條件的數據其中,方法會取出滿足條件的第條記錄。本文由發表于個人博客,采用自由轉載保持署名非商用禁止演繹協議發布。非商業轉載請注明作者及出處。本文標題為插件系列本文鏈接為更多閱讀 簡介 MongoDB 是一個文檔型數據庫,是 NoSQL (not only SQL) 的一種,具有靈活、易擴展等諸多優點,受到許多開發者的青睞。MongoEngine ...
摘要:環境或使用以下命令安裝會出現以下錯誤定為中的錯誤行是在讀取文件時發生錯誤,此文件為,其為幫助說明文檔。粗暴一點,將其中的內容刪除。上下載源碼包。運行如下命令安裝 環境: windows 10、python 3.5、flask-mongoengine 0.8.2或0.9.0 使用以下命令安裝 flask-mongoengine pip install flask-mongoengine ...
閱讀 2753·2021-11-22 14:45
閱讀 896·2021-10-15 09:41
閱讀 1058·2021-09-27 13:35
閱讀 3662·2021-09-09 11:56
閱讀 2626·2019-08-30 13:03
閱讀 3191·2019-08-29 16:32
閱讀 3296·2019-08-26 13:49
閱讀 766·2019-08-26 10:35