この記事では、MongoEngine のクラシック クエリについて詳しく説明します (詳細なケースを含む)。

序文

学習した知識を定着させるために、著者は将来の復習を容易にするためにいくつかの学習ノート ブログの公開を開始しようとしました。もちろん、初心者が新しいテクノロジーを学ぶのに役立つのであれば、それも素晴らしいことです。著者は新人なので、記事に記録ミスがある場合は、読者や友人が批判して修正してください。
(ブログの参照ソース コードは、私のホームページのリソースにあります。学習プロセス中に質問がある場合は、コメント エリアで質問してください)あ>

宝物を発見する

数日前、巨大な人工知能学習 Web サイトを発見しました。わかりやすくてユーモアがあるので、みんなと共有せずにはいられませんでした。 【宝の入り口】。

1. データベースのクエリ(すべて)

  • MongoEngine では、MongoDB データベース内のすべてのドキュメントをクエリするには、モデルの object 属性を使用し、オプションで all() メソッドを呼び出すことができます
books = Books.objects
books2 =  Books.objects.all()

ここに画像の説明を挿入します

  • Document クラスには、クラスに関連付けられたデータベース内のオブジェクトにアクセスするために使用されるオブジェクト属性があります。 objects プロパティは実際には QuerySetManager であり、新しい QuerySet オブジェクト。この QuerySet オブジェクトを反復して、データベースからドキュメントを取得できます。
for book in Books.objects:
    print (book.bookName)

ここに画像の説明を挿入します

2. フィルタクエリ(単一、条件)

1. 単一項目をチェックする

MongoEngine では、単一のドキュメントをクエリするには、first() メソッドまたは を使用できます。 get() メソッド (ニーズとクエリ条件に応じて)。

1. first() メソッドを使用して、条件を満たす最初のドキュメントをクエリします。

# 查询第一个 brand 字段名称为 rmzxb 的报纸
books = Books.objects(brand='rmzxb').first()

ここに画像の説明を挿入します

2. get() メソッドを使用して、条件を満たす一意のドキュメント (存在する場合) をクエリします。

  • コレクション内で一意である必要がある結果を取得するには、 get() を使用します。 DoesNotExist この値は、クエリに一致するドキュメントがなく、MultipleObjectsReturned にクエリに一致するドキュメントが複数ある場合に生成されます。これらの例外は、ドキュメント定義にマージされます (例: MyDoc.DoesNotExists)。

  • このメソッド get_or_create() のバリアントは存在しますが、安全ではありません。 mongoDB にトランザクションがないため、セキュリティを確保できません。これと同様の方法を使用するときにデータが誤ってコピーされないように、他の方法を調査する必要があります。したがって、0.8 で非推奨となり、0.10 で削除されました。

  • クエリの成功例

# 查询符合条件的唯一文档(如果存在)
books = Books.objects.get(isbn='4754959145206026241')

ここに画像の説明を挿入します

  • クエリの失敗例
# 查询符合条件的唯一文档(如果存在)
books = Books.objects.get(brand='rmzxb')

ここに画像の説明を挿入します

2. 利用可能なフィルタークエリ演算子

効果 象徴的な表現 英語のフルネーム
等しくない それはです 等しくない
未満 それ 未満
以下 LTE 以下
以上 GT より大きい
以上 ジーテ 以上
ネガティブ標準チェック。他の演算子の前に使用できます。たとえば、年齢が 5 の倍数ではないクエリ ドキュメント: Q (age_ not ない
値はリスト内にあります (値のリストを提供する必要があります)
値がリストにありません (値のリストを提供する必要があります)
年齢フィールドがモジュラス条件を満たすドキュメントをクエリします。たとえば、年齢を 5 で割って余りが 1 になるドキュメント result = person.objects(age_ _mod=(5, 1)) に対して
提供された値のリストの各項目は配列内にあります。たとえば、 all メソッドを使用して、指定されたすべての趣味を持つ人々をクエリします people = Person.objects(hobbies_ _all=hobbies) 全て
配列のサイズ。たとえば、size メソッドを使用して、特定の数の趣味を持つ人々をクエリします。 count = person.objects(hobbies_ _size=hobby) サイズ
フィールド値が存在します。たとえば、exists() メソッドを使用して、名前フィールド people_with_name = Person.objects(name_ _exists=True) を含むドキュメントをクエリします。 存在します

3. フィルタークエリ演算子の使用のデモンストレーション

  • 2023-05-25 より前の日付の新聞を検索する
presentPublishDate = '2023-05-25T00:00:00.000+00:00'
book = Books.objects(publishDate__exists=True, publishDate__lt=presentPublishDate)

ここに画像の説明を挿入します

  • リスト内の新聞のisbnを問い合わせる
isbns = ['4759307800083959809','4760032575949377537']
book = Books.objects(isbn__in=isbns)

ここに画像の説明を挿入します

3. 文字列クエリ (あいまい)

1. 利用可能なあいまいクエリ演算子

効果 文字表現
文字列フィールドの完全一致値 ちょうど
文字列フィールドは値と正確に一致します(大文字と小文字は区別されません) 正確な
文字列フィールドに値が含まれています 含まれています
文字列フィールドには値が含まれます(大文字と小文字は区別されません) アイコンが含まれています
文字列フィールドは値で始まります から始まる
文字列フィールドは値で始まります (大文字と小文字は区別されません) から始まる
文字列フィールドは値で終わります で終わる
文字列フィールドは値で終わります (大文字と小文字は区別されません) 終わります
文字列フィールドには単語全体が含まれます 単語全体
文字列フィールドには単語全体が含まれます (大文字と小文字は区別されません)。 全文
正規表現文字列フィールドのマッチング 正規表現
正規表現文字列フィールドのマッチング (大文字と小文字は区別されません) イ正規表現
$elemMatch を実行して、配列内のドキュメント全体を照合できるようにします マッチ

2. ファジークエリ演算子の使用のデモンストレーション

  • 記事タイトルに指定した文字列が含まれる新聞をクエリする
title_input = '回信勉励海军'
article = Cards.objects(title__contains=title_input).first()

4. 元のクエリ ( _ _ raw _ _ )

1. 元のクエリの詳細な説明

  • MongoEngine では、生のクエリを使用して MongoDB クエリ ステートメントを実行できます。これにより、MongoEngine API による制限を受けることなく、MongoDB クエリ コマンドを直接送信できます。生のクエリは、MongoDB クエリを直接作成できるため、複雑なクエリや特殊なクエリを実行する必要がある場合に便利です。

  • は、元の PyMongo クエリをクエリ パラメーターとして提供でき、クエリに直接統合されます。これは、raw キーワード引数を使用して行われます。

  Page.objects(__raw__={
    
    'tags': 'coding'})
  • 同様に、生の更新をメソッド update() に提供できます。
  Page.objects(tags='coding').update(__raw__={
    
    '$set': {
    
    'tags': 'coding'}})
  • そして、この 2 つを組み合わせることもできます。
  Page.objects(__raw__={
    
    'tags': 'coding'}).update(__raw__={
    
    '$set': {
    
    'tags': 'coding'}})
  • 生のクエリを使用すると、複雑なクエリを実行できますが、MongoEngine のオブジェクト マッピングと検証をバイパスするため、注意して使用する必要があることに注意してください。潜在的なセキュリティ問題を回避するために、元のクエリが正しく安全であることを確認してください。

2. 元のクエリの例

  • ID が指定範囲内にあり、スナップショット フィールドの値が 0 ではない新聞をクエリします。
book_ids = [13586,13849,13871]
sm = {
    
    '_id': {
    
    '$in': book_ids}, 'snapshots.0': {
    
    '$exists': True}}
docs: Books = Books.objects(__raw__=sm)

ここに画像の説明を挿入します

5. ソート/ソート結果(+、-)

order_by() を使用して、1 つ以上のキーで結果を並べ替えることができます。順序は、各キーの前に「+」または「-」を付けることで指定できます。プレフィックスがない場合は、昇順とみなされます。

# Order by ascending date
blogs = BlogPost.objects().order_by('date')    # equivalent to .order_by('+date')

# Order by ascending date first, then descending title
blogs = BlogPost.objects().order_by('+date', '-title')

6. 結果の制限とスキップ ([ ]、first())

  • 従来の ORM と同様に、返される結果の数を制限したり、クエリ内の数値や結果をスキップしたりできます。 limit() メソッドと Skip() メソッドは QuerySet オブジェクトで使用できますが、この目的には配列スライス構文が推奨されます。
# 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 は、最初の結果を取得し、結果が存在しない場合は None を返すショートカットを提供します (first() ):
# 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

7. 集計クエリ

1.合計

  • sum() を使用して、ドキュメント上の特定のフィールドの値を合計できます。
  yearly_expense = Employee.objects.sum('salary')
  • フィールドがドキュメント内に存在しない場合、ドキュメントは合計から除外されます。

2. 平均を求める

  • ドキュメントのコレクションのフィールドの平均を取得するには、 Average() を使用します。
  mean_age = User.objects.average('age')

3. カウンティング

  • 結果を制限したりスキップしたりするのと同じように、QuerySet オブジェクトには count() というメソッドがあります。
  num_users = User.objects.count()
  • 技術的には、 len(User.objects) を使用して同じ結果を得ることができますが、 count() よりもはるかに遅くなります。サーバー側でカウント クエリを実行すると、MongoDB に面倒な作業を実行させ、ネットワーク経由で 1 つの整数を受信します。同時に、すべての結果が取得され、ローカル キャッシュに配置され、最終的に len() が結果をカウントします。これら 2 つの操作のパフォーマンスを比較すると、len() は count() よりもはるかに遅いです。

book_ids = [13586,13849,13871]
sm = {
    
    '_id': {
    
    '$in': book_ids}, 'snapshots.0': {
    
    '$exists': True}}
count = client.get_db()['books'].count(sm)

ここに画像の説明を挿入します

4. 周波数を見つける

MongoDB はネイティブ リストを提供するため、MongoEngine はコレクション全体にわたるリスト内の項目の頻度の辞書を取得するヘルパー メソッド item_frequency() を提供します。その使用例は、「タグ クラウド」を生成することです。

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]

要約する

メッセージを残したり、コメントを交換したり、批判したりすることができます。記事が役に立った場合、または著者の文章が優れていると思われる場合は、クリックしてフォロー、いいね、収集、サポートすることができます。
(ブログの参照ソース コードは、私のホームページのリソースにあります。学習プロセス中に質問がある場合は、コメント エリアで質問してください)あ>

おすすめ

転載: blog.csdn.net/HHX_01/article/details/133673116