この記事では主に MongoDB の高度な動的フィールド設計に関する情報を紹介します。この記事の紹介は非常に詳細であり、必要な場合はエディターに従って学習することができます。
この記事は主に MongoDB の動的フィールド設計に関する関連情報を紹介しており、必要な方は詳細な紹介を参照してください。
読者に最適
MongoDB開発者
基本的なニーズ
製品: 「ユーザーが必要なものを追加できるようにする優れた機能を既存のフォームに追加しますフィールド「
技術目標バージョン1
動的フォームデータの保存(新しいフィールドはスキーマを変更する必要はありません)」
まず、どのような種類のインデックスがサポートされているかについて話しましょうMongoDB
通常のフィールド Index
// 假如我们的文档长这样 { "name": "MongoDB", "age": 5 } // 对age字段建立索引 { "age": 1 }
埋め込みドキュメントインデックス
// 假如我们的文档长成了Object { "person": { "age": 2, "name": "MongoDB" } } //对person.age字段建立索引 { "person.age": 1 }
Arrayドキュメントインデックス
// 假如我们的文档长成了数组 { "persons": [ { "name": "MongoDB", age: 5}, { "name": "MySQL", age: 20} ] } //对persons.age字段建立索引 { "persons.age": 1 }
上記どれもフィールドを動的に追加する機能を実現できないようです
プログラマーAとプログラマー S は次のような会話をしました:
プログラマー A: 「それでは、動的コンテンツを保存するために別のコレクションを追加する必要があります。」
プログラマー S: 「しかし、MongoDB の関連クエリに対するサポートは非常に弱く、方法はありません」関連する並べ替えを実行するために。後の製品で並べ替えとフィルター機能が追加されると聞いて唖然としていたら、ああ、これを知っていたら MongoDB は必要なかったでしょう。」
- 動的フォーム データを保存するための要件を検討します
フィールドを追加し、インデックスも作成できるようにする
解決策配列を使用して動的フィールドを保存します
ストレージ構造は次のとおりです:
//描述collection { "_id":"描述id", "type":"类型", "text": "订单名称", "default": "Default Name", } // 原本的表单增加字段form用来存储动态数据 { "_id": "", "name": "一个好名字", "form":[ { "_id":"描述_id", "value": 10}, { "_id":"描述_id", "value": "我的好伙伴"}, ] }
クエリ、並べ替え、フィルターの方法 // 比如用户增加了2个字段
// 现在要对字段1进行排序
db.items.find().sort({"form.0.value":1})
// 对字段2进行筛选
db.items.find({"form.1.value":"我的好伙伴"})
control
プログラマー : "Fxxx"
それでは、そのようなデータはどのように保存されるべきでしょうか?解決策は次のとおりです:
値は 1,2,4,8... のバイナリ形式で保存されます
たとえば、
MongoDB は、$bitsAllSet、$bitsAnySet、$bitsAllClear、$bitsAnyClear などのビット単位のクエリ演算子関数を含む強力な集計関数を提供します
db.items.aggregate([ { "$match": { "$elemMatch": { "描述id": "id", "value": { $bitsAnySet: [ 1, 5 ] } } }} ])
上記で、MongoDB の動的フィールド設計を使用するさまざまな側面が完了しました一種の需要
以上がMongoDB 上級章 動的フィールド設計の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。