搜索不适用于 Typeorm、mongodb、nestjs 的文档

问题描述 投票:0回答:2

我在nestjs、typeorm、mongodb 中有一个应用程序。这些是版本

"@nestjs/common": "^8.0.0",
"@nestjs/typeorm": "^8.0.4",
"mongodb": "^4.6.0",
"typeorm": "^0.3.6"

我正在尝试通过这种方式实现mongo文档中的部分搜索,这是我完整的服务文件

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { ILike, Like, MongoRepository, Raw, Repository } from 'typeorm';
import { City } from './city.entity';

@Injectable()
export class AppService {
  constructor(
    @InjectRepository(City)
    private citiesRepository: MongoRepository<City>,
  ) {}
  getSuggestions(query: string): Promise<City[]> {
    console.log('in fun, query', query);
    // return this.citiesRepository.findBy({
    //   name: Like(`%${query}%`)
    // });
    return this.citiesRepository.find({
      where: {
        // "name": { "$regex": ".*a.*"}
        // name: Like(`%${query}%`)
        // name: Like('a')
        // name: new RegExp(`^${query}`)
        // name: Raw(alias => `${alias} ILIKE '%${query}%'`),
        // name: "Alma" <= this works
        // name: new RegExp(query, 'i').toString()
        // $or: [{ name: new RegExp(query, 'i').toString() }],
        // name: {pattern: '.*a.*',options: ''}
        // name: { $eq: "Alma" }
      }
    });
    // not assignable to type 'string | FindOperator<string>'.ts(2322)
    
  }
}

所有注释的解决方案都不起作用,我面临的错误是 “无法分配给类型 'string | FindOperator'.ts(2322)” 这是因为在实体中,名称是字符串类型,当然应该是,这是我的实体文件

import {Entity, ObjectID, ObjectIdColumn, Column} from "typeorm";

@Entity()
export class City {
    
    @ObjectIdColumn()
    _id: ObjectID;

    @Column()
    id: string;
    
    @Column()
    name: string;

我可以选择迁移到 mongoose,但我想坚持使用 typeorm,因为它适用于所有类型的数据库 我是 mongo 的初学者,可能这就是为什么我缺少一些基础知识的原因,但我之前在 typeorm 工作过并且有这方面的经验

regex mongodb search nestjs typeorm
2个回答
3
投票

有同样的问题,在互联网上找不到任何东西,所以我做了一个非常丑陋的解决方案。

const ugly: any = { $regex: /a/ }
 return this.citiesRepository.find({
  where: {
    name: ugly
  }
});

0
投票

我做了一些测试,发现它与 mongoose 非常相似。

这对我有用

const ugly: any = { $regex: /a/ }
 return this.citiesRepository.find({
  where: {
    name: {
      $regex: new RegExp('a'),
      $options: 'i',
    },
});
© www.soinside.com 2019 - 2024. All rights reserved.