成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

MongoEngine 查詢(翻譯)

int64 / 3201人閱讀

摘要:數(shù)據(jù)庫查詢對象有一個屬性,用來訪問在數(shù)據(jù)庫中跟這個類有關(guān)的對象。使用方法在數(shù)據(jù)不存在的時候會返回默認(rèn)查詢默認(rèn)情況下,的屬性返回一個一個對象,它并沒有進(jìn)行任何篩選和過濾,它返回的是所有的數(shù)據(jù)對象。它返回結(jié)果是函數(shù)的返回值。

數(shù)據(jù)庫查詢

Document 對象有一個 objects 屬性,用來訪問在數(shù)據(jù)庫中跟這個類有關(guān)的對象。這個 objects 屬性其實是一個QuerySetManager ,它會創(chuàng)建和返回一個新的 QuerySet 對象的訪問。這個 QuerySet 對象可以從數(shù)據(jù)庫中遍歷獲取的文檔:

# Prints out the names of all the users in the database
for user in User.objects:
    print user.name
過濾查詢

可以通過調(diào)用 QuerySet 對象的關(guān)鍵字參數(shù)來對數(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")

對于內(nèi)嵌document的字段可以使用 __ 來代替對象屬性訪問語法中的 . 進(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)

可用的運算符如下:

ne?– 不等于

lt?– 小于<

lte?– 小于等于

gt?– 大于>

gte?– 大于等于

not?– 否定一個標(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?– 存在這個值

字符串查詢

以下操作符可以快捷的進(jìn)行正則查詢:

exact?– 字符串型字段完全匹配這個值

iexact?– 字符串型字段完全匹配這個值(大小寫敏感)

contains?– 字符串字段包含這個值

icontains?– 字符串字段包含這個值(大小寫敏感)

startswith?– 字符串字段由這個值開頭

istartswith?– 字符串字段由這個值開頭(大小寫敏感)

endswith?– 字符串字段由這個值結(jié)尾

iendswith?– 字符串字段由這個值結(jié)尾(大小寫敏感)

match?– 執(zhí)行 $elemMatch 操作,所以你可以使用一個數(shù)組中的 document 實例

地理查詢

PASS

列表查詢

對于大多數(shù)字段,這種語法會查詢出那些字段與給出的值相匹配的document,但是當(dāng)一個字段引用 ListField 的時候,而只會提供一條數(shù)據(jù),那么包含這條數(shù)據(jù)的就會被匹配上:

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ù)來使用一個原始的 PyMongo 語句來進(jìn)行查詢,這樣可以進(jìn)行原始的完整查詢:

Page.objects(__raw__={"tags": "coding"})
限制和跳過結(jié)果

就像傳統(tǒng)的ORM一樣,你有時候需要限制返回的結(jié)果的數(shù)量,或者需要跳過一定數(shù)量的結(jié)果。QuerySet 里面可以使用 limit()skip() 這兩個方法來實現(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]

你可以指定讓查詢返回一個結(jié)果。如果這個條在數(shù)據(jù)庫中不存在,那么會引發(fā) IndexError 錯誤 。使用 first() 方法在數(shù)據(jù)不存在的時候會返回 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)情況下,Documentobjects 屬性返回一個一個 QuerySet 對象,它并沒有進(jìn)行任何篩選和過濾,它返回的是所有的數(shù)據(jù)對象。這一點可以通過給一個 document 定義一個方法來修改 一個queryset 。這個方法需要兩參數(shù)__doc_clsqueryset 。第一個參數(shù)是定義這個方法的 Document 類名(從這個意義上來說,這個方法像是一個 classmethod() 而不是一般的方法),第二個參數(shù)是初始化的 queryset。這個方法需要使用 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 的時候,繼承 QuerySet 類對你來說就是個好的方法。為了在 document 里面使用一個自定義的 QuerySet 類,你可以在 document 里的 meta 字典里設(shè)置 queryset_class 的值來實現(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 提供了一個包裝過的內(nèi)置的方法,同時自身提供了一些方法,它實現(xiàn)了在數(shù)據(jù)庫服務(wù)上執(zhí)行的 Javascript 代碼的功能。

結(jié)果計數(shù)

就像限制和跳過結(jié)果一樣, QuerySet 對象提供了用來計數(shù)的方法 - count(),不過還有一個更 Pythonic 的方法來實現(xiàn):

num_users = len(User.objects)
更多功能

當(dāng)你想為 document 的特定的字段的數(shù)量計數(shù)的時候,可以使用 sum()

yearly_expense = Employee.objects.sum("salary")

當(dāng)你想求某個字段的平均值的時候,可以使用 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

高級查詢

有時候使用關(guān)鍵字參數(shù)返回的 QuerySet 不能完全滿足你的查詢需要。例如有時候你需要將約束條件進(jìn)行and,or 的操作。你可以使用 MongoEngine 提供的 Q 類來實現(xiàn),一個 Q 類代表了一個查詢的一部分,里面的參數(shù)設(shè)置與你查詢document 的時候相同。建立一個復(fù)雜查詢的時候,你需要用 &| 操作符將 Q 對象連結(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() 方法自動更新。下面幾種操作符可以被用到這幾種方法上:

set?– 設(shè)置成一個指定的值

unset?– 刪除一個指定的值

inc?– 將值加上一個給定的數(shù)

dec?– 將值減去一個給定的數(shù)

push?– 在 list 中添加一個值

push_all?– 在 list 中添加一個值

pop?– 移除list 的第一項或最后一項(根據(jù) pop__=val val 的值決定刪除第一項還是最后一項,一般情況下,val 為負(fù)則刪除第一項,為正則刪除最后一項,參見:mongodb $pop

pull?– 從 list 里面移除一個值

pull_all?– 從 list 里面移除個值

add_to_set?– 當(dāng)要添加的值不在 list 中時,添加這個值

原子更新的語法類似于查詢語法,區(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ù)的返回值。這個功能是通過QuerySet()對象的exec_js() 方法實現(xiàn)。傳遞一個包含一個Javascript函數(shù)的字符串作為第一個參數(shù)。

其余位置的參數(shù)的名字字段將作為您的Javascript函數(shù)的參數(shù)傳遞過去。

在 JavaScript 函數(shù)范圍中,一些變量可用:

collection?– 對應(yīng)使用的 Document 類的集合的名稱

query?– 一個?QuerySet 對象

options?– 一個對象,它包含要傳遞給 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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38332.html

相關(guān)文章

  • MongoEngine 查詢翻譯

    摘要:數(shù)據(jù)庫查詢對象有一個屬性,用來訪問在數(shù)據(jù)庫中跟這個類有關(guān)的對象。使用方法在數(shù)據(jù)不存在的時候會返回默認(rèn)查詢默認(rèn)情況下,的屬性返回一個一個對象,它并沒有進(jìn)行任何篩選和過濾,它返回的是所有的數(shù)據(jù)對象。它返回結(jié)果是函數(shù)的返回值。 數(shù)據(jù)庫查詢 Document 對象有一個 objects 屬性,用來訪問在數(shù)據(jù)庫中跟這個類有關(guān)的對象。這個 objects 屬性其實是一個QuerySetManage...

    didikee 評論0 收藏0
  • django開發(fā)-mongodb的配置與使用

    摘要:今天整理了一下在項目中如何使用環(huán)境如下第一步在中配置和配置如下可以同時使用和數(shù)據(jù)庫引擎你要存儲數(shù)據(jù)的庫名,事先要創(chuàng)建之?dāng)?shù)據(jù)庫用戶名密碼主機(jī)數(shù)據(jù)庫使用的端口連接中數(shù)據(jù)庫名稱為的數(shù)據(jù)庫第二步向中插入數(shù)據(jù)插入類型數(shù)據(jù)插入數(shù)據(jù)格式為插入含有的數(shù)據(jù)用 今天整理了一下在django項目中如何使用mongodb, 環(huán)境如下:ubuntu18.04, django2.0.5, drf3.9, mong...

    appetizerio 評論0 收藏0
  • django開發(fā)-mongodb的配置與使用

    摘要:今天整理了一下在項目中如何使用環(huán)境如下第一步在中配置和配置如下可以同時使用和數(shù)據(jù)庫引擎你要存儲數(shù)據(jù)的庫名,事先要創(chuàng)建之?dāng)?shù)據(jù)庫用戶名密碼主機(jī)數(shù)據(jù)庫使用的端口連接中數(shù)據(jù)庫名稱為的數(shù)據(jù)庫第二步向中插入數(shù)據(jù)插入類型數(shù)據(jù)插入數(shù)據(jù)格式為插入含有的數(shù)據(jù)用 今天整理了一下在django項目中如何使用mongodb, 環(huán)境如下:ubuntu18.04, django2.0.5, drf3.9, mong...

    masturbator 評論0 收藏0
  • Flask 插件系列 - Flask-MongoEngine

    摘要:查詢數(shù)據(jù)查詢所有數(shù)據(jù)使用方法查詢滿足某些條件的數(shù)據(jù)其中,方法會取出滿足條件的第條記錄。本文由發(fā)表于個人博客,采用自由轉(zhuǎn)載保持署名非商用禁止演繹協(xié)議發(fā)布。非商業(yè)轉(zhuǎn)載請注明作者及出處。本文標(biāo)題為插件系列本文鏈接為更多閱讀 簡介 MongoDB 是一個文檔型數(shù)據(jù)庫,是 NoSQL (not only SQL) 的一種,具有靈活、易擴(kuò)展等諸多優(yōu)點,受到許多開發(fā)者的青睞。MongoEngine ...

    Backache 評論0 收藏0
  • 關(guān)于flask-mongoengine 庫的安裝

    摘要:環(huán)境或使用以下命令安裝會出現(xiàn)以下錯誤定為中的錯誤行是在讀取文件時發(fā)生錯誤,此文件為,其為幫助說明文檔。粗暴一點,將其中的內(nèi)容刪除。上下載源碼包。運行如下命令安裝 環(huán)境: windows 10、python 3.5、flask-mongoengine 0.8.2或0.9.0 使用以下命令安裝 flask-mongoengine pip install flask-mongoengine ...

    alaege 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<