2017-02-11 4 views
0

mongodbは結合をサポートしていないため、さまざまなビジネスコレクション、サービス、およびユーザーを検索する必要があるため、解決策を思いつきましたが、改善される。複数の参照されたコレクションでmongoとのテキストを検索

スキームの流れは次のようになります。

Business = Schema({ 
    name:String 
    services:[{ 
    type:ObjectId, 
    ref:'Services' 
    }], 
    specialist:[{ 
    type:ObjectId, 
    ref:'User' 
    }] 
}) 

User = Schema({ 
    full_name:String 
    businesses:[{ 
    _id:{ 
     type:ObjectId, 
     ref:'Business' 
    }, 
    name:String, 
    role:String, 
    is_owner:Boolean 
    }] 
}) 

Service = Schema({ 
    name:String, 
    business:{ 
    type:ObjectId, 
    ref:'Business' 
    }, 
    specialist:[{ 
    type:ObjectId, 
    ref:'User' 
    }] 
}) 

Search = Schema({ 
    text:{ 
    type:String, 
    index:'text' 
    }, 
    business:{ 
    _id:{ 
     type:ObjectId, 
     ref:'Business' 
    }, 
    name:String 
}, 
services:[{ 
    _id:{ 
    type:ObjectId, 
    ref:'Service' 
    }, 
    name: 
}], 
specialist:[{ 
    _id:{ 
    type:ObjectId, 
    ref:'User' 
    }, 
    full_name:String 
}] 
}) 

企業がサービスを提供し、サービスは専門家によって行われ、毎回のビジネスは専門家を追加している、ユーザーが自分のデータに新しいビジネスを持っています特定の役割を持っています。

アイデアは、ビジネスを作成するときに検索でドキュメントを作成し、ビジネスがスペシャリストに割り当てられたサービスを作成するときに検索コレクションに追加されるという考えです。この文書の各変更では、テキストフィールドはビジネス名、サービス、および専門家の連結で更新され、テキストの索引付き検索を行う場所は単一のコレクションになります。あなたが探しているフィールドは、ビジネスにつながります。

誰がモデルと共通のコレクションの解決策の両方で検索するか提案しています。

答えて

0

バージョン3.2で新しい$lookup (aggregation)を確認してください。

左外側を実行 処理のためのコレクションを「参加」からの文書にフィルタリングする同じ データベース内unshardedコレクションに参加します。 $ルックアップ段階では、 フィールドと入力ドキュメントのフィールドとの間に、 "joined"コレクションのドキュメントのフィールドとの一致が行われます。

ちなみに、ドキュメントデータベースの利点は、多数の結合を排除することです。 関連情報は、MongoDBクエリ言語による高速クエリアクセスのためにまとめて格納されています。このデータモデルを使用すると、階層関係の表示、配列の格納、および他のより複雑な構造を簡単に表すことができます。ですから、MongoDBスキーマを設計する際には、可能な限り単一のドキュメントに配置する必要があります。

詳細はMongoDB relationships: embed or reference?からご覧になれます。

これが役に立ちます。

関連する問題