【问题标题】:.find() in a populated query MongoDB (mongoose).find() 填充查询 MongoDB (mongoose)
【发布时间】:2021-03-03 04:32:07
【问题描述】:

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

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.”)。 我的问题是在查询期间我没有找到如何用companyplatform 填充companyContract

有什么想法吗?

【问题讨论】:

    标签: mongodb mongoose nestjs


    【解决方案1】:
    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();
    

    你可以用这个方法。它会起作用的。

    【讨论】:

    • 否,因为此代码仅填充响应而不是查询,因此公司名称和平台名称在这种情况下不存在
    【解决方案2】:

    我通过在类构造函数中导入带有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();
    

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

    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'},
    ]
    

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

    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;
      }   
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-25
      • 2017-12-23
      • 2013-07-06
      • 1970-01-01
      • 2020-03-14
      • 2020-10-14
      • 2012-07-03
      相关资源
      最近更新 更多