2016-10-17 10 views
0

私はMongo Collectionsを持っているMeteorプロジェクトに取り組んでおり、関係やMeteor collectionヘルパーパッケージの取り扱い方法はわかりません。Mongodb組み込みオブジェクトとMeteorコレクションヘルパー

今まで私たちは埋め込み文書を保管していました。たとえば、私たちはインターンシップコレクションを持っており、このインターンシップを作成したユーザー(所有者)とすべてのインターンシップに埋め込み文書があります。

私たちはMeteor collectionヘルパーパッケージ(https://github.com/dburles/meteor-collection-helpers)を使用することに決めましたので、必要な値を返すメソッドを追加することができます。問題は埋め込まれたドキュメントが与えられたメソッドを失ったことです。

インターンシップでは、関連するコレクションIDを保存するだけです。もし私たちがStreet、Postcode、Cityの3つのプロパティで分けられたInternship.addressを取得したいのであれば、 'internship.getAddress () '。別の例は、あなたがアプリケーション文書を扱っている場合に、インターンシップの住所を得ることです。 Application.getInternship()。getAddress()メソッドを呼び出すことができます。これにより、埋め込みドキュメントを保存する必要はありません。

異なるフィールドを使用してMongoクエリを実行する必要がある場合、問題が発生します。私たちはこれに対処する方法を疑問に思うよう

Application.search = (query) => { 
    Application.find({ 
     'applicant._id': Meteor.userId(), 
     $or: [ 
      {"internship.title": { $regex: query, $options: 'i' }}, 
      {"internship.description": {$regex: query, $options: 'i' }}, 
     ], 
    }, {sort: { updatedAt: -1 }, 
    }).fetch(); 
} 

Internship.titleとdescripionはもはやインターンシップ埋め込まれた文書で保存されていない:私たちは、与えられた文字列に一致するすべての文書を返し、非常に単純な検索機能を持っています。

答えて

0

はのは、あなたのApplicationsコレクションがApplicationsコレクション内のinternshipIds配列してInternshipsコレクションに関連しているとしましょう。

Application.search = (query) => { 
    // find cursor internships that match the query 
    const matchingInternships = Internships.find({ 
    $or: [ 
     {title: { $regex: query, $options: 'i' }}, 
     {description: {$regex: query, $options: 'i' }} 
    ] 
    }); 
    // extract the list of _ids from this cursor 
    const intershipIds = matchingInternships.map(i=>{return i._id}); // array of internshipIds 
    Application.find({ 
    'applicant._id': Meteor.userId(), 
    internshipId: {$elemMatch: internshipIds } // look for internshipIds that are in the array 
    },{sort: { updatedAt: -1 }, 
    }).fetch(); 
} 

これは、ネストされたSQL SELECTステートメントを実行に多少似ている、例::

SELECT * FROM APPLICATIONS WHERE internshipID IN 
    (SELECT ID FROM INTERNSHIPS WHERE 
    (title LIKE query OR description LIKE query) 
); 
その後、次の操作を行うことができます
関連する問題