首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从嵌套对象数组中查找猫鼬

从嵌套对象数组中查找猫鼬
EN

Stack Overflow用户
提问于 2021-09-07 20:21:49
回答 1查看 276关注 0票数 0

嘿,我对猫鼬很陌生,我的头也找不到。

模型

代码语言:javascript
代码运行次数:0
运行
复制
User->resumes[]->employments[]

UserSchema

代码语言:javascript
代码运行次数:0
运行
复制
{
    resumes: [ResumeSchema],
    ...
}

ResumeSchema

代码语言:javascript
代码运行次数:0
运行
复制
{
    employments: [EmploymentSchema],
    ...
}

EmploymentSchema

代码语言:javascript
代码运行次数:0
运行
复制
{
    jobTitle: {
        type: String,
        required: [true, "Job title is required."]
    },
    ...
}

背景

用户必须从现有简历的现有数据中输入职位名称和需求建议,并输入他们的职务名称。

我试过以下代码。

代码语言:javascript
代码运行次数:0
运行
复制
let q = req.query.q; // Software
User.find({ "resumes.employments.jobTitle": new RegExp(req.query.q, 'ig') }, {
    "resumes.employments.$": 1
}, (err, docs) => {
    res.json(docs);
})

输出

代码语言:javascript
代码运行次数:0
运行
复制
[
    {
        _id: '...',
        resumes:[
            {
                employments: [
                    {
                      jobTitle: 'Software Developer',
                      ...
                    },
                    ...
                ]
            },
            ...
        ]
    },
    ...
]

预期OutPut

代码语言:javascript
代码运行次数:0
运行
复制
["Software Developer", "Software Engineer", "Software Manager"]

Problem 1:)返回的数据太多,因为我只需要jobTitle

2:)所有的工作都已返回,而查询与其中的一项相匹配

3)有什么更好的方法吗?通过索引还是通过$search?我在猫鼬文档中找不到太多信息来创建搜索索引(我也不知道如何创建复合索引以使其工作)

我知道可能有很多答案,但没有人帮上忙,或者我无法让他们发挥作用.我对mongodb非常陌生,我一直通过SQL或ORM处理关系数据库,所以我的mongodb概念和知识是有限的。

因此,如果有更好的解决办法,请告诉我。或者能让现在的那个起作用的东西。

EN

回答 1

Stack Overflow用户

发布于 2021-09-07 21:42:29

您可以使用下面的一个聚合查询来获得这个结果:

代码语言:javascript
代码运行次数:0
运行
复制
[
  {
    "jobTitle": [
      "Software Engineer",
      "Software Manager",
      "Software Developer"
    ]
  }
]

查询是:

  • 首先使用$unwind两次解构数组并获取值。
  • 然后,$match按您希望使用$regex筛选的值进行筛选。
  • 然后$group将所有值集合在一起(使用_id: null$addToSet不添加重复项)。
  • 最后,$project只显示您想要的字段。
代码语言:javascript
代码运行次数:0
运行
复制
User.aggregate({
  "$unwind": "$resumes"
},
{
  "$unwind": "$resumes.employments"
},
{
  "$match": {
    "resumes.employments.jobTitle": {
      "$regex": "software",
      "$options": "i"
    }
  }
},
{
  "$group": {
    "_id": null,
    "jobTitle": {
      "$addToSet": "$resumes.employments.jobTitle"
    }
  }
},
{
  "$project": {
    "_id": 0
  }
})

示例这里

另一种选择是将$filter应用于$project阶段:

与以前类似,但两次使用$filter而不是$unwind

代码语言:javascript
代码运行次数:0
运行
复制
User.aggregate({
  "$unwind": "$resumes"
},
{
  "$project": {
    "jobs": {
      "$filter": {
        "input": "$resumes.employments",
        "as": "e",
        "cond": {
          "$regexMatch": {
            "input": "$$e.jobTitle",
            "regex": "Software",
            "options": "i"
          }
        }
      }
    }
  }
},
{
  "$unwind": "$jobs"
},
{
  "$group": {
    "_id": null,
    "jobTitle": {
      "$addToSet": "$jobs.jobTitle"
    }
  }
},
{
  "$project": {
    "_id": 0
  }
})

示例这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69094158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档