使用meteor-autocomplete搜索同一集合的多个字段?

时间:2017-08-30 17:09:20

标签: javascript jquery mongodb meteor meteor-blaze

我正在使用mizzao/meteor-autcomplete以便在您键入查询时从MongoDB集合返回匹配的项目。

如果我只搜索一个字段,我就能成功完成此操作,但它不允许我搜索同一个集合的多个字段。

我试图这样做:

Template.foo.helpers({
    settings: function() {
            return {
                position: 'bottom',
                limit: 5,
                rules: [
                     {
                         collection: Models,
                         field: 'name',
                         matchAll: true,
                         template: Template.standardLegends,
                    },
                    {
                        collection: Models,
                        field: 'createdBy',
                        matchAll: true,
                        template: Template.standardLegendsOwner,
                    },
                ],
            };
        },
});

我查看了github开放问题,并且有一个类似的问题,他们说使用选择器函数来返回多个字段,但我真的不能理解我是什么应该做的。

以下是该主题的链接: https://github.com/mizzao/meteor-autocomplete/issues/13

任何帮助都将不胜感激。

进一步说明

以下是从我的模型集合返回的数据集的示例:

0: 
    _id:"KwTZmBC5qBcwK7kzR"
    name:"drillCase.stl"
    units:"mm"
    createdBy:"Bob M"
    createdDate:"Tue Aug 29 2017 03:19:10 GMT-0400 (EDT)"
1:
    _id:"ljknbgwlkejb56"
    name:"cone.stl"
    units:"mm"
    createdBy:"Michael C"
    createdDate:"Tue Aug 29 2017 03:45:10 GMT-0400 (EDT)"

以下是我目前用于显示自动填充结果的模板:

<template name="standardLegendsOwner">
    <span class="fieldName" style="width: 500px">{{name}}</span>
</template>

所以,让我们说我想要返回与“已创建”相关的所有项目&#39;价值观&#39; Bob M&#39;。现在,如果我键入Bob M,我会返回&#39; drillCase.stl&#39;相反,因为我们正在搜索名称&#39;字段和模板中我们返回的名称&#39;值。

所以我的问题是,是否有可能在模板内部设置一个条件语句,如果您匹配的字段是&#39; name&#39;返回名称值,否则返回&quot; createdBy&#39;值。

我现在遇到的问题是,如果我输入Bob M.并且他与多个对象相关联,那么它将返回与他匹配的第一个值。

1 个答案:

答案 0 :(得分:0)

selector函数基本上需要返回query要使用的.find()对象。要查看多个字段,您还需要$or:

Template.foo.helpers({
  settings() {
    return {
      position: 'bottom',
      limit: 5,
      rules: [
        {
           collection: Models,
           field: 'name',
           matchAll: true,
           template: Template.standardLegends,    
           selector(match) {
             regex = new RegExp(match, 'i')
             return {$or: [{'name': regex}, {'createdBy': regex}]}
           },
         }
       ],
     };
   },
});

我阅读了mizzao的文档:自动完成了一点,并意识到它实际上返回了匹配文档中的所有字段。这意味着您在结果模板中具有很大的灵活性。例如,你可以这样做:

<template name="standardLegendsOwner">
  <span class="fieldName" style="width: 500px">{{name}} - {{createdBy}}</span>
</template>

因为您知道其中一个字段是匹配的。您还可以编写一个帮助程序,准确创建您想要查看的内容。