【问题标题】:Fulltext mongodb $text search query in graphql-compose-mongoosegraphql-compose-mongoose 中的全文 mongodb $text 搜索查询
【发布时间】:2020-07-15 22:44:52
【问题描述】:

我无法弄清楚如何构造一个 graphql 查询来使用文本索引执行 mongodb 全文搜索。 https://docs.mongodb.com/manual/text-search/

我已经在 mongoose 架构中的字符串上创建了一个文本索引,但我在 grapqhl 操场中显示的架构中看不到任何内容。

【问题讨论】:

    标签: graphql-compose-mongoose


    【解决方案1】:

    有点晚了,虽然我能够像这样实现它

    const FacilitySchema: Schema = new Schema(
        {
            name: { type: String, required: true, maxlength: 50, text: true },
            short_description: { type: String, required: true, maxlength: 150, text: true },
            description: { type: String, maxlength: 1000 },
            location: { type: LocationSchema, required: true },
        },
        {
            timestamps: true,
        }
    );
    
    FacilitySchema.index(
        {
            name: 'text',
            short_description: 'text',
            'category.name': 'text',
            'location.address': 'text',
            'location.city': 'text',
            'location.state': 'text',
            'location.country': 'text',
        },
        {
            name: 'FacilitiesTextIndex',
            default_language: 'english',
            weights: {
                name: 10,
                short_description: 5,
                // rest fields get weight equals to 1
            },
        }
    );
    

    为模型创建 ObjectTypeComposer 后,添加此

    const paginationResolver = FacilityTC.getResolver('pagination').addFilterArg({
        name: 'search',
        type: 'String',
        query: (query, value, resolveParams) => {
            resolveParams.args.sort = {
                score: { $meta: 'textScore' },
            };
            query.$text = { $search: value, $language: 'en' };
            resolveParams.projection.score = { $meta: 'textScore' };
        },
    });
    
    FacilityTC.setResolver('pagination', paginationResolver);
    

    然后你可以这样分配

    
    const schemaComposer = new SchemaComposer();
    
    schemaComposer.Query.addFields({
       // ...
       facilities: Facility.getResolver('pagination')
       // ...
    });
    

    在您的客户端,像这样执行查询

    {
      facilities(filter: { search: "akure" }) {
        count
        items {
          name
        }
      } 
    }
    

    【讨论】:

      猜你喜欢
      • 2013-11-19
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2020-12-06
      • 2019-11-25
      • 1970-01-01
      相关资源
      最近更新 更多