MongoDB多字段聚合搜索

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

我正在尝试构建一个用于搜索作业的 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
和公司

也遵循同样的做法

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

mongodb mongoose aggregation-framework
2个回答
0
投票

根据集合、索引等的大小,可以在您的案例中应用许多策略(您的、AdamExchange 的策略、与 $lookup 阶段的聚合...)。

但我认为你真的必须寻找索引和

索引交集策略来真正优化你的查询

我愿意 :

  • 首先在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 条件的每种情况。


0
投票
在 Mongoose 中,您可以使用聚合管道执行多个字段搜索。聚合管道允许您对 MongoDB 数据执行复杂的数据转换和查询,包括跨多个字段进行搜索。以下是有关如何使用聚合管道在 Mongoose 中执行多个字段搜索的分步指南:

© www.soinside.com 2019 - 2024. All rights reserved.