0

我尝试对这种模型提出查找请求:

import { Document } from 'mongoose';

export interface CompanyContract extends Document {
  name: string;
  company: string; // ID of the company
  platform?: string; // ID of the platform 
}

我想提出这样的要求:

await this.companyContractModel
    .find({
      $or: [
        { name: { $regex: `.*${searchQuery}.*`, $options: 'i' } },
        { 'company.name': { $regex: `.*${searchQuery}.*`, $options: 'i' } },
        { 'platform.name': { $regex: `.*${searchQuery}.*`, $options: 'i' } },
        ],
    })

该变量searchQuery包含搜索的内容(例如:“Apple Inc.”)。我的问题是我没有找到如何在查询中companyContract填充company和填充。platform

有任何想法吗 ?

4

2 回答 2

0
await this.companyContractModel
.find({
  $or: [
    { name: { $regex: `.*${searchQuery}.*`, $options: 'i' } },
    { 'company.name': { $regex: `.*${searchQuery}.*`, $options: 'i' } },
    { 'platform.name': { $regex: `.*${searchQuery}.*`, $options: 'i' } },
    ],
}).populate('company')
  .populate('platform')
  .exec();

你可以用这个方法做到这一点。它会起作用的。

于 2020-11-21T02:52:06.270 回答
0

InjectModel()我通过在类构造函数中导入 companyModel 找到了解决方案。

export class CompanyContractService {
  constructor(
    @InjectModel('CompanyContract')
    private readonly companyContractModel: Model<CompanyContract>,
    @InjectModel('Company')
    private readonly companyModel: Model<Company>,
  ) {}
}

然后在我的搜索功能中,我用我的搜索字符串查询 companyModel 并将响应存储在一个数组中。

const companies = await this.companyModel 
 .find({ name: { $regex: `.*${search}.*`, $options: 'i' } })
 .exec();

之后,我默认使用正则表达式名称搜索searchArray为我的请求声明了一个数组。$or

const searchArray: {}[] = [
 { name: { $regex: `.*${search}.*`, $options: 'i' } },
];

接下来,我遍历公司数组并将过滤器推入searchArray.

companies.forEach(company => {
 searchArray.push({
  company: company.id,
 });
});

这个数组看起来像这样:

searchArray = [
{ name: { $regex: `.*${search}.*`, $options: 'i' } },
{ company: 'ff40dea498393'},
{ company: 'df43939498393'},
{ company: 'daa4399394393'},
]

最后,我companyContractModel使用我的$or 过滤器进行查询并返回它。

const contracts = await this.companyContractModel
 .find({
  $or: searchArray,
      })   
 .exec();        

return contracts;

我的整个代码:

@Injectable()
export class CompanyContractService {
  constructor(
    @InjectModel('CompanyContract')
    private readonly companyContractModel: Model<CompanyContract>,
    @InjectModel('Company')
    private readonly companyModel: Model<Company>,
  ) {}

async search(search: string): Promise<CompanyContract[]> {
    const companies = await this.companyModel
      .find({ name: { $regex: `.*${search}.*`, $options: 'i' } })
      .exec();

    const searchArray: {}[] = [
      { name: { $regex: `.*${search}.*`, $options: 'i' } },
    ];

    companies.forEach(company => {
      searchArray.push({
        company: company.id,
      });
    });

    const contracts = await this.companyContractModel
      .find({
        $or: searchArray,
      })   
      .exec();        

    return contracts;
  }   
 }
}
于 2020-11-21T15:39:56.213 回答