【问题标题】:MongoDB aggregate search with multiple fields具有多个字段的 MongoDB 聚合搜索
【发布时间】:2020-12-08 13:08:09
【问题描述】:

我正在尝试构建一个用于搜索作业的 API

前端输入:带有字符串的单个字段keyword

API 响应:返回与以下任何字段匹配的作业列表

  1. 技能
  2. 位置
  3. 公司

架构

1.工作模式

title: {
    type: String,
    required: true,
  },
 location: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'location',
  },
  skills:[{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Skill'
  }],
company: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'company',
  },

如您所见,技能、位置和公司被映射到另一个集合中,并且前端没有对关键字进行分隔我不确定我可以用哪种方式编写有效的搜索查询

现在的方法是

  1. 根据技能名称查找 Skill_id 并获取所有具有所需技能的工作

location 和公司也一样

但我不确定这是正确的方法,有人可以建议这样做的正确方法

【问题讨论】:

  • 我想我会稍微调整一下你的方法。我会首先得到与搜索条件匹配的skill_ids、location_ids 和company_ids。然后我会使用这些 id 来创建 1 个关于作业的查询。这样做的好处是只获取一次作业,而不必担心在多个查询中重复作业。

标签: mongodb mongoose aggregation-framework


【解决方案1】:

根据集合、索引等的大小,可以在您的情况下应用许多策略(您的、AdamExchange 的策略、使用 $lookup 阶段的聚合...)...

但我认为您确实必须考虑索引和index intersection 策略才能真正优化您的查询

我愿意:

  • 首先在 Skill.name / location.name / company 索引上创建 3 个单一索引 ===>这样您就可以使用索引在不同的集合中找到 id。

  • 为工作集合创建单一索引:位置、技能、公司

  • 然后您可以像这样简单地运行您的查询(假设 MyKeyword 是您的前端字段的值)[伪代码,我不知道您使用的语言]:

    skillId = db.skill.find({name:MyKeyword });

    locationId = db.location.find({name:MyKeyword });

    companyId = db.company.find({name:MyKeyword });

     db.job.find({
       $or: [
         {
           skill: {
             $eq: skillId
           }
         },
         {
           location: {
             $eq: locationId
           }
         },
         {
           company: {
             $eq: companyId
           }
         }
       ]
     })
    

因此,您可以利用索引来查询“辅助集合”,以及针对主集合的 $or 条件的每种情况的索引交集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2021-06-02
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多