国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MongoEngine 查詢(翻譯)

int64 / 3203人閱讀

摘要:數(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)情況下,Documentobjects 屬性返回一個(gè)一個(gè) QuerySet 對(duì)象,它并沒有進(jìn)行任何篩選和過濾,它返回的是所有的數(shù)據(jù)對(duì)象。這一點(diǎn)可以通過給一個(gè) document 定義一個(gè)方法來修改 一個(gè)queryset 。這個(gè)方法需要兩參數(shù)__doc_clsqueryset 。第一個(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)行andor 的操作。你可以使用 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__=val val 的值決定刪除第一項(xiàng)還是最后一項(xiàng),一般情況下,val 為負(fù)則刪除第一項(xiàng),為正則刪除最后一項(xiàng),參見:mongodb $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

相關(guān)文章

  • MongoEngine 查詢翻譯

    摘要:數(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...

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

    摘要:今天整理了一下在項(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...

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

    摘要:今天整理了一下在項(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...

    masturbator 評(píng)論0 收藏0
  • Flask 插件系列 - Flask-MongoEngine

    摘要:查詢數(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 ...

    Backache 評(píng)論0 收藏0
  • 關(guān)于flask-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 ...

    alaege 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<