ホームページ  >  記事  >  データベース  >  MongoDB 上級章 動的フィールド設計

MongoDB 上級章 動的フィールド設計

零下一度
零下一度オリジナル
2018-05-17 14:00:502318ブラウズ

この記事では主に 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 は必要なかったでしょう。」

- 動的フォーム データを保存するための要件を検討します

  • フィルタリングと並べ替えをサポートする必要があります

  • 技術目標バージョン 2

フィールドを追加し、インデックスも作成できるようにする

解決策


配列を使用して動的フィールドを保存します

  • 説明コレクションを追加してユーザーのフォーム構成を記録します

  • ストレージ構造は次のとおりです:

    //描述collection 
    {
     "_id":"描述id",
     "type":"类型",
     "text": "订单名称",
     "default": "Default Name",
    }
    
    // 原本的表单增加字段form用来存储动态数据
    {
     "_id": "",
     "name": "一个好名字",
     "form":[
     { "_id":"描述_id", "value": 10},
     { "_id":"描述_id", "value": "我的好伙伴"},
     ]
    }

注意!!! n 個のフィールドを追加すると、説明コレクションは同時に n 個のドキュメントを追加します

クエリ、並べ替え、フィルターの方法

// 比如用户增加了2个字段
// 现在要对字段1进行排序
db.items.find().sort({"form.0.value":1})
// 对字段2进行筛选
db.items.find({"form.1.value":"我的好伙伴"})
上の例からわかるように、ユーザーがフィールド値を入力しなくても、すべての Document フォームの n 番目のフィールドが同じ
control

であることを確認するために、null 値を保存する必要があります。これにより、フィールドをフィルタリングして並べ替えてインデックス付けできるようになります

さらに深く掘り下げてください

製品: 「ユーザーがドロップダウン ボックスと複数選択ボックスを追加できるようにする必要があり、フィルターと並べ替えも行う必要があります。」

プログラマー : "Fxxx"

それでは、そのようなデータはどのように保存されるべきでしょうか?


解決策は次のとおりです:


値は 1,2,4,8... のバイナリ形式で保存されます

たとえば、

ユーザーは、複数選択ボックスの場合、1 が保存され、2 番目の項目は 2 で保存され、3 番目の項目は 4 で保存されます


ユーザーが複数選択ボックスの最初の項目 + 3 番目の項目を選択すると、5 が保存され、 (1+4)


MongoDB は、$bitsAllSet、$bitsAnySet、$bitsAllClear、$bitsAnyClear などのビット単位のクエリ演算子関数を含む強力な集計関数を提供します

db.items.aggregate([
 {
  "$match": {
  "$elemMatch": {
   "描述id": "id",
   "value": { $bitsAnySet: [ 1, 5 ] }
  }
 }}
])

上記で、MongoDB の動的フィールド設計を使用するさまざまな側面が完了しました一種の需要

以上がMongoDB 上級章 動的フィールド設計の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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