目次
定义文档的模式
文档字段
文档之间引用关系
一对多的关系
引用对象的删除操作
索引

mongoengine教程(2)文档模式

Jun 07, 2016 pm 04:34 PM
mongodb 1つ チュートリアル 書類 モデル

在MongoDB中一个文档(document)与关系型数据库中的一行(row)相似;文档保存在集合(collection)中,行保存在表(table)中。 定义文档的模式 与django类似,要定义一个文档模式只需要创建一个类继承自 Document,并添加一些 Field 对象。 from mongoengine impo

在MongoDB中一个文档(document)与关系型数据库中的一行(row)相似;文档保存在集合(collection)中,行保存在表(table)中。

定义文档的模式

与django类似,要定义一个文档模式只需要创建一个类继承自 Document,并添加一些 Field 对象。

from mongoengine import *
import datetime
class Page(Document):
    title = StringField(max_length=200, required=True)
    date_modified = DateTimeField(default=datetime.datetime.now)
ログイン後にコピー

如上定义了一个文档模式具有 title和date_modified 两个字段。

同时MongoDB本身就是无模式的,因此我们还可以创建动态的文档模式。它可以在添加数据时为不同的数据设置不同的字段。

class Page(DynamicDocument):
    title = StringField(max_length=200, required=True)
ログイン後にコピー

添加数据:

page = Page(title='Using MongoEngine')
page.tags = ['mongodb', 'mongoengine']
page.save()
ログイン後にコピー

文档字段

文档字段(Field)不是必需的,但是使用它来进行数据验证、设置默认值等操作会比较方便。

MongoEngine提供了如下这些类型的Field:

  • BinaryField
  • BooleanField
  • ComplexDateTimeField
  • DateTimeField
  • DecimalField
  • DictField
  • DynamicField
  • EmailField
  • EmbeddedDocumentField
  • FileField
  • FloatField
  • GenericEmbeddedDocumentField
  • GenericReferenceField
  • GeoPointField
  • ImageField
  • IntField
  • ListField
  • MapField
  • ObjectIdField
  • ReferenceField
  • SequenceField
  • SortedListField
  • StringField
  • URLField
  • UUIDField

文档之间引用关系

在关系型数据库中多个表可以使用外键进行关联。然而MongoDB是无模式的,因此想要达到这样的效果就这能在应用程序中自己手动的进行关联了。

不过还好,使用MongoEngine的ReferenceField可以很方便的实现。

class User(Document):
    name = StringField()
class Page(Document):
    content = StringField()
    author = ReferenceField(User)
john = User(name="John Smith")
john.save()
post = Page(content="Test Page")
post.author = john
post.save()
ログイン後にコピー

一对多的关系

对于一对多的关系可以使用ListField来保存一个ReferenceField列表。在进行查询操作是需要传入一个实例对象。

class User(Document):
    name = StringField()
class Page(Document):
    content = StringField()
    authors = ListField(ReferenceField(User))
bob = User(name="Bob Jones").save()
john = User(name="John Smith").save()
Page(content="Test Page", authors=[bob, john]).save()
Page(content="Another Page", authors=[john]).save()
# Find all pages Bob authored
Page.objects(authors__in=[bob])
ログイン後にコピー

引用对象的删除操作

MongoDB默认不会检查数据的完整性,因此在删除一个对象是就需要自己手动的处理引用了该对象的其他对象。

同样的MongoEngine也提供了一样的功能。ReferenceField有一个 reverse_delete_rule 参数可以进行设置。它的取值如下:

  • mongoengine.DO_NOTHING:默认就是这个值,它不会进行任何操作。
  • mongoengine.DENY:如果该对象还被其他对象引用,则拒绝删除。
  • mongoengine.NULLIFY:将其他对象对该对象的引用字段设为null。
  • mongoengine.CASCADE:将引用了该对象的其他对象也删除掉。
  • mongoengine.PULL:移除对该对象的引用。

索引

与django的Model相似,MongoEngine的Document也可以在meta属性中设置索引。

class Page(Document):
    title = StringField()
    rating = StringField()
    meta = {
        'indexes': ['title', ('title', '-rating')]
    }
ログイン後にコピー

meta中的indexes可以是一个列表,也可以是一个字典。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Nodejsとvuejsの違い Nodejsとvuejsの違い Apr 21, 2024 am 04:17 AM

Node.js はサーバー側の JavaScript ランタイムであり、Vue.js は対話型ユーザー インターフェイスを作成するためのクライアント側の JavaScript フレームワークです。 Node.js はバックエンド サービス API 開発やデータ処理などのサーバー側開発に使用され、Vue.js はシングルページ アプリケーションや応答性の高いユーザー インターフェイスなどのクライアント側開発に使用されます。

iPhoneでサイレントモードが機能しない:修正 iPhoneでサイレントモードが機能しない:修正 Apr 24, 2024 pm 04:50 PM

おやすみモードで電話に応答することさえ、非常に煩わしい経験になる可能性があります。名前が示すように、おやすみモードでは、すべての着信通知と電子メール、メッセージなどからの警告がオフになります。これらのソリューション セットに従って問題を修正できます。解決策 1 – フォーカス モードを有効にする 携帯電話でフォーカス モードを有効にします。ステップ 1 – 上から下にスワイプしてコントロール センターにアクセスします。ステップ 2 – 次に、携​​帯電話の「フォーカスモード」を有効にします。フォーカス モードでは、電話機のサイレント モードが有効になります。携帯電話に着信通知が表示されることはありません。解決策 2 – フォーカス モード設定を変更する フォーカス モード設定に問題がある場合は、修正する必要があります。ステップ 1 – iPhone の設定ウィンドウを開きます。ステップ 2 – 次に、フォーカス モード設定をオンにします

夏はぜひ虹を撮ってみてください 夏はぜひ虹を撮ってみてください Jul 21, 2024 pm 05:16 PM

夏の雨の後には、美しく魔法のような特別な天気の風景、虹がよく見られます。これも写真撮影ではなかなか出会えない光景で、とてもフォトジェニックです。虹が現れるにはいくつかの条件があります。まず、空気中に十分な水滴があること、そして、低い角度から太陽が当たることです。そのため、雨が上がった午後が最も虹が見えやすいのです。ただし、虹の発生は天候や光などの条件に大きく左右されるため、一般に虹の持続時間は短く、見頃や撮影に最適な時間はさらに短くなります。では、虹に遭遇したとき、どうすれば虹を適切に記録し、高品質の写真を撮ることができるでしょうか? 1. 虹を探す 上記の条件に加えて、虹は通常、太陽光の方向に現れます。つまり、太陽が西から東に輝いている場合、虹は東に現れやすくなります。

間違った仮想通貨チェーンを取り戻すには?間違った仮想通貨送金チェーンを取得するためのチュートリアル 間違った仮想通貨チェーンを取り戻すには?間違った仮想通貨送金チェーンを取得するためのチュートリアル Jul 16, 2024 pm 09:02 PM

仮想市場の拡大は仮想通貨の流通と不可分であり、当然仮想通貨の送金問題とも不可分である。一般的な転送エラーはアドレス コピー エラーで、もう 1 つのエラーはチェーン選択エラーです。仮想通貨を間違ったチェーンに転送することは依然として厄介な問題ですが、初心者は転送操作の経験が浅いため、間違ったチェーンを転送してしまうことがよくあります。間違ったリンクはサードパーティのプラットフォームを通じて取得できますが、成功しない可能性があります。次に、編集者が仮想資産をより適切に管理するために役立つ詳細を説明します。間違った仮想通貨チェーンを取り戻すには?間違ったチェーンに転送された仮想通貨を取得するプロセスは複雑で困難な場合がありますが、転送詳細を確認し、取引所またはウォレットプロバイダーに連絡し、互換性のあるウォレットに秘密キーをインポートし、クロスチェーンブリッジツールを使用することで、

navicat の有効期限が切れた場合の対処方法 navicat の有効期限が切れた場合の対処方法 Apr 23, 2024 pm 12:12 PM

Navicat の有効期限の問題を解決するには、ライセンスを更新する、自動更新を無効にする、Navicat プレミアム エッセンシャルの無料バージョンを使用する、などがあります。

Nodejsのフロントエンドとバックエンドの区別 Nodejsのフロントエンドとバックエンドの区別 Apr 21, 2024 am 03:43 AM

Node.js は、フロントエンド (ユーザー インターフェイスと対話の処理) とバックエンド (ロジックとデータの管理) の両方に使用できます。フロントエンドは HTML、CSS、JavaScript フレームワークを使用し、フロントエンドは Node.js フレームワーク、データベース、クラウド サービスを使用します。焦点が異なります (フロントエンドはエクスペリエンスに重点を置き、バックエンドは機能に重点を置きます)、実行環境も異なります (フロントエンドはブラウザー内にあり、バックエンドはサーバー上にあります)。ツールも異なります。両者は異なります (フロントエンドとバックエンドは異なるコード コンパイルとパッケージ化ツール セットを使用します)。どちらも JavaScript を使用しますが、異なる API とライブラリにアクセスします。

IDE で Golang 関数のドキュメントを表示するにはどうすればよいですか? IDE で Golang 関数のドキュメントを表示するにはどうすればよいですか? Apr 18, 2024 pm 03:06 PM

IDE を使用して Go 関数のドキュメントを表示する: 関数名の上にカーソルを置きます。ホットキーを押します (GoLand: Ctrl+Q; VSCode: GoExtensionPack をインストールした後、F1 キーを押して「Go:ShowDocumentation」を選択します)。

フロントエンドでnodejsを学ぶのは難しいですか? フロントエンドでnodejsを学ぶのは難しいですか? Apr 21, 2024 am 04:57 AM

フロントエンド開発者にとって、Node.js の学習の難しさは、JavaScript の基礎、サーバーサイド プログラミングの経験、コマンド ラインの習熟度、および学習スタイルによって異なります。学習曲線には、基本概念、サーバー側アーキテクチャ、データベース統合、非同期プログラミングに焦点を当てた入門レベルと上級レベルのモジュールが含まれています。全体として、JavaScript の基礎がしっかりしていて、時間と労力を惜しまない開発者にとって、Node.js の学習は難しくありませんが、関連する経験が不足している開発者にとっては、克服しなければならない特定の課題がある可能性があります。

See all articles