【问题标题】:Search multiple fields of the same collection using meteor-autocomplete?使用流星自动完成搜索同一集合的多个字段?
【发布时间】:2018-02-08 12:10:14
【问题描述】:

我使用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 open issues,有一个类似的问题,他们说要使用 selector 函数来返回多个字段,但我真的不明白我应该做什么做。

这是该主题的链接: 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>

假设我想返回与“createdBy”值“Bob M”相关联的所有项目。现在,如果我输入 Bob M,我会返回“drillCase.stl”,因为我们正在按“名称”字段进行搜索,并且在模板中我们会返回“名称”值。

所以我的问题是,是否可以在模板内设置一个条件语句来说明,如果您匹配的字段是“名称”返回名称值,否则返回“createdBy”值。

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

【问题讨论】:

    标签: javascript jquery mongodb meteor meteor-blaze


    【解决方案1】:

    selector函数基本上需要返回.find()要使用的query对象。要查看多个字段,您还需要$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:autocomplete 的文档,并意识到它实际上返回了匹配文档中的所有字段。这意味着您的结果模板具有很大的灵活性。例如你可以这样做:

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

    因为您知道其中一个字段将匹配。您还可以编写一个帮助程序来创建您想要看到的内容。

    【讨论】:

    • 谢谢你现在更有意义了。是否有根据返回的字段显示唯一模板?目前 Template.standardLegends 有一个 span 标签,它返回 {{name}} 字段。有什么方法可以根据匹配的值指定唯一模板吗?或者可能在模板内部设置条件,根据匹配的内容显示不同的字段?
    • 更具体地说,如果我当前按“createdBy”字段搜索并选择自动完成选项,它仍会按“名称”字段搜索 Mongo。因此,它不会返回集合中包含“createdBy”查询的所有项目,而是返回一个“名称”项目,该项目恰好也与“createdBy”字段匹配。我希望我能正确解释这一点,提前道歉。
    • 我认为 mizzao:autocomplete 只返回匹配文档中的一个字段,即使它在这里搜索两个字段。我可以想象如果其他字段匹配,它会给你的结果与显示的字段完全不匹配。我不确定您是否可以强制它返回匹配的字段的值。
    • 可能显示一些示例文档以及您期望返回的内容可能有助于解释问题。
    • 添加了更多信息,希望对您有所帮助。
    猜你喜欢
    • 2015-10-23
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多