2017-06-09 11 views
1

Meteorでpublineメソッドを実装することができました。これはtemplate.jsを購読するときにmongoコレクションへのクエリを実行します。同じ方法で複数の属性検索を追加するようにします。ですから、私はMongoにコレクションがあり、ドキュメントはすべて同じ属性ですが、値が異なります。MeteorでMongoの複数の属性を検索

{batch:'HAHT020614' color: 'blue', material: 'plastic', printing: true, 
    model: 'H100', handle: 'plastic', product: 'C010' } 
{batch:'HBTH060614' color: 'red', material: 'metal', printing: false, 
    model: 'V400', handle: 'metal', product: 'P001' } 
... 

私は反応性VARSを介してすべてのユーザー選択したフィールドが含まれている公開メソッドにオブジェクトを送信しようとしている:publication.jsで次に

Template.inventory.onCreated(function appBodyOnCreated() { 
    this.searchQuery = new ReactiveVar({ 
     color: anyItem, 
     batch: anyItem, 
     model: anyItem, 
     material: anyItem, 
     handle: anyItem, 
     printing: anyItem, 
     product: anyItem, 
    }); 
    this.autorun(function() { 
     let template = Template.instance(); 
     template.subscribe("stock.search", template.searchQuery.get()); 
    }); 
}); 

Meteor.publish('stock.search', function stockQuery(search) { 
    return Stock.find(
    { $and: [ 
     {color: { $regex : search.color }}, 
     {batch: { $regex : search.batch}}, 
     {product: { $regex : search.product}}, 
     {model: { $regex : search.model}}, 
     {material: { $regex : search.material}}, 
     {handle: { $regex : search.handle}}, 
     {printing: { $regex : search.printing}} 
     ] 
    }, 
    { limit: 10, sort: { batch: 1 } }); 
}); 

問題は、検索フィールドのいくつかは、ユーザーのニーズに応じてアプリケーションで使用されるかどうかであり、たとえば、青色と、製作された、または私の両方のすべてのアイテムを検索できるようにすることですタルを見つけ、見つけ出すのに必要なものをミックスしてマッチさせるだけです。

オブジェクトはパブリッシュメソッドに正しく到達し、属性を抽出することができますが、Mongoに特定の属性を「any」に一致させることが可能かどうかわからないため、問題はクエリにあります。私は{$ exists:true}をデフォルト(および検索フィールドが空の場合)属性として渡して、コレクション内のいずれかのドキュメントと一致するようにしましたが、クエリは正しく返されていないようです。この場合、私はregexを "contains"のようなものとして使用していますが、var anyItemは空の文字列です。

特定の属性のみを選択した値と一致させるためにmongoを照会する適切な方法はありますか?あなたが公開法にのみnull以外の基準に合格し、このようにだけ与えられた基準でクエリを構築することができ

答えて

1

Meteor.publish('stock.search', function stockQuery(search) { 
    const criteria = Object.keys(search).map(k => ({ [k]: { $regex: search[k] } })); 
    return Stock.find(
     { $and: criteria }, 
     { limit: 10, sort: { batch: 1 } } 
    ); 
}); 
+0

私はそのキャプチャイベントのロジックのビットを変更する必要がありました値は少し調整して、これは完璧に機能しました!ありがとうございました! – Railoh

関連する問題