Mongodb 如何使用更多参数搜索meteor中的集合

Mongodb 如何使用更多参数搜索meteor中的集合,mongodb,meteor,meteor-blaze,Mongodb,Meteor,Meteor Blaze,我需要帮助搜索流星收集更多的参数。 我使用搜索查询和过滤器查看集合中的某些对象。问题是,我希望客户端加载整个集合,然后反应性地更改用户看到的内容,但只更改订阅,而不再次调用服务器。现在,搜索查询+一个过滤器可以正常工作,但前提是每次发生变化时我都要调用服务器。现在,在我下面的代码中,您可以看到我正在使用if-else元素进行操作,但这不是一个好方法。任何建议都会有帮助。多谢各位 Template.jobs.onCreated( function showOnCreate() {

我需要帮助搜索流星收集更多的参数。 我使用搜索查询和过滤器查看集合中的某些对象。问题是,我希望客户端加载整个集合,然后反应性地更改用户看到的内容,但只更改订阅,而不再次调用服务器。现在,搜索查询+一个过滤器可以正常工作,但前提是每次发生变化时我都要调用服务器。现在,在我下面的代码中,您可以看到我正在使用if-else元素进行操作,但这不是一个好方法。任何建议都会有帮助。多谢各位

        Template.jobs.onCreated( function showOnCreate() {
        Meteor.subscribe('Jobs');
        this.searchQuery = new ReactiveVar('');

        this.remoteQuery = new ReactiveVar(false);
        this.typeQuery = new ReactiveVar(false);
    });

    Template.jobs.helpers({
        job: () => {
            query = Template.instance().searchQuery.get();

            remoteQuery = Template.instance().remoteQuery.get();
            typeQuery = Template.instance().typeQuery.get();

            let regex = new RegExp( query, 'i' );
    // **************************
           // the problem starts here
    // **************************
            if (Router.current().params.slug) {
                const companyJobs = Company.findOne({slug: Router.current().params.slug}).jobs;
                if ( companyJobs !== undefined) {

                    return Meteor.subscribe('Jobs', {'_id': { '$in': companyJobs }});
                }
                return false
            } else if (Router.current().params.slug === undefined && remoteQuery === true ) {
                return Job.find({  $or: [ { Name: regex }, { Description: regex }, ]  , Remote: true, positionType: [],});
            } else if (typeQuery = '') {
            return Job.find({  $or: [ { Name: regex }, { Description: regex }, ] , positionType: typeQuery, });
        },
// -------*****************************

        employer: () => {
            if (Router.current().params.slug === undefined) {
                Meteor.subscribe('Companies');
                return 'Poslodavac: ' + Company.findOne({_id: Template.currentData().CompanyId}).Name;
            }
            return false
        },

        jobUrl: () => {
            Meteor.subscribe('Companies');
            companySlug = Company.findOne({_id: Template.currentData().CompanyId}).slug;
            return ('/company/' + companySlug + '/job/' );
        }
    });

Template.jobs.events({ 
    'click .positionType': (event, templateInstance) => {
        if (Template.instance().remoteQuery.get().lenght > 1){
            Template.instance().typeQuery.set(Template.instance().remoteQuery.get().push(event.target.value));
            console.log(Template.instance().remoteQuery.get())
        } else {
            console.log(Template.instance().remoteQuery.get())
            console.log('ggggggg')
            Template.instance().typeQuery.set(event.target.value);
        }
    },
    'click #remoteFriendly': (event, templateInstance) => {
        Template.instance().remoteQuery.set(!Template.instance().remoteQuery.get());
    },

}); 
带有过滤器的Html tempalte:

    <template name="jobs" >

    <div>
        <p>Filteri:</p>

        <span>
            <input type="checkbox" id="remoteFriendly" name="remote"> <span for="remoteFriendly"> Remote friendly? </span>
        </span>

        <span>
            <p>Tip pozicije:</p>
            <input type="checkbox" class="positionType" id="1" value="Programiranje" > <span for="1"> Programiranje </span>
            <input type="checkbox" class="positionType" id="2" value="Dizajn" > <span for="2"> Dizajn </span>
            <input type="checkbox" class="positionType" id="3" value="Marketing" > <span for="3"> Marketing </span>
            <input type="checkbox" class="positionType" id="4" value="Ostalo" > <span for="4"> Ostalo </span>
        </span>
    </div>

    {{#each job}}
        <div style="border: 0.1rem solid black; margin: 1cm; padding: 5px; max-width: 420px;" > <!-- OVO JE PRIVREMENI STIL, OBRISATI-->
            <p> Posao: {{Name}} <br> Opis: {{Description}}</p>
            <p> {{employer}} </p>
            <p>Remote friendly?: {{Remote}}</p>
            <p>Tip pozicije: {{positionType}}</p>
            <p> Saznajte vise <a href="{{jobUrl}}{{_id}}"> OVDE</a></p>
        </div>    
    {{/each}}
    <p id="nesto"></p>
</template>

Filteri:

远程友好? 提示:pozicije:

节目主持人 迪扎恩 营销 奥斯塔洛 {{{每项工作} Posao:{{Name}
Opis:{{Description}

{{雇主}

远程友好?:{Remote}

提示:pozicije:{{positionType}

萨兹纳吉特虎钳

{{/每个}}

欢迎来到SO

您似乎混淆了Pub/Sub和
收藏。查找

您应该首先意识到这两种机制是不同的,它们提供不同的功能

  • Pub/Sub确实将数据从服务器发送到客户端的Minimongo数据库。但这些数据还没有显示出来
  • Collection.find
    在服务器上用于实际的MongoDB,在客户端上用于本地的Minimongo DB
因此,在您的客户端上,一旦您正确订阅了服务器出版物(通常在应用程序级别或模板级别/在
onCreated
hook中),您就可以直接调用
Jobs。在助手(或其他任何地方)中查找
以获取文档,而无需更改订阅(除非后者需要新参数)

您的注释代码应该没有问题:

return Job.find({'_id': { '$in': companyJobs }});
一般来说,避免在helpers(如
Meteor.subscribe
)中进行任何昂贵的计算,因为helpers可能会在您没有注意到的情况下执行多次。您的
Meteor.subscribe('companys')
也应该转到模板级别(即在
onCreated
钩子中)

因此,与其在助手中执行
if/else
条件,只需在模板级别执行一次即可。为了说明您需要使用另一个集合中另一个文档的值,为什么不直接将公司的slug作为参数传递给作业订阅,并执行计算服务器端?Or甚至只是订阅所有内容,就像您当前的初始订阅一样


然后,您的助手将只使用
作业。查找
,它将查询您客户的本地minimongo DB,而不限制您的服务器。

先生,非常感谢您的回答!您真的帮助我清除了这个minimongo内容!还有我的第二个问题,我想您没有理解我:在代码中,在
之后,如果(companyJobs!==undefined){
,我想用三个参数筛选集合。第一个参数是在搜索输入中插入的搜索查询,第二个参数是,,,用户是否只想查看远程友好作业(布尔)”,第三个参数是三种作业位置。因此用户可以选择两种位置。
job.find({$or:[{Name:regex},{Description:regex},],Remote:true,positionType:[],});
很抱歉,您的问题听起来仍然很困惑。此答案针对发布/订阅部分,不必在模板中调用服务器。如果您还需要查询方面的帮助,我认为将其拆分为一个新问题更合适。感谢您的建议。我将提出新的、更好描述的问题。