首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示文档匹配多少字段的MongoDB查询

显示文档匹配多少字段的MongoDB查询
EN

Stack Overflow用户
提问于 2021-05-18 04:44:36
回答 1查看 149关注 0票数 1

我正在创建一个MERN应用程序,允许用户注册并将他们的技能保存到数据库中。我正在创建一个管理面板,允许我搜索用户的技能。在数据库中,用户的技能如下所示:

代码语言:javascript
复制
skills: [
  {skill: 'React', yearsExperience: 3},
  {skill: 'HTML', yearsExperience: 5},
  {skill: 'JavaScript', yearsExperience: 5},
  {skill: 'Git', yearsExperience: 3},
  {skill: 'TypeScript', yearsExperience: 1},
  {skill: 'C++', yearsExperience: 1}
]

我使用OR查询来查询数据库,以撤回符合以下几个要求的用户(用户的用户在C方面的经验超过3年,或者在SQL方面的经验超过3年):

代码语言:javascript
复制
$or: [
    { skills: { $elemMatch: { skill: 'C', yearsExperience: { $gt: 3 } } } },
    { skills: { $elemMatch: { skill: 'SQL', yearsExperience: { $gt: 3 } } } },
 ];

我的问题是,如何用一个名为percentageMatch的属性返回数组中的用户,该属性显示查询搜索到的匹配字段的数量?例如,如果Mark同时拥有超过3年的C和SQL经验,他的财产将说是100%,但是如果James只有3年或3年以上的SQL经验,而没有C经验的话,他的percentageMatching就会说50%。

代码语言:javascript
复制
// Response of match query
[
  {
    name: 'Mark',
    skills: [...],
    percentageMatch: 100%
  },
  {
    name: 'James',
    skills: [...],
    percentageMatch: 50%
  }
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-18 05:03:52

你可以用聚合来做,

  • 获取所需文档的$match
  • $filter根据您的条件筛选数组并使用$addFields将其分配给matchingSkills
  • 然后使用$multiply$divide得到百分比。

这是代码

代码语言:javascript
复制
db.collection.aggregate([
  {
    "$match": { name: "mark" }
  },
  {
    $addFields: {
      matchingSkills: {
        $filter: {
          input: "$skills",
          cond: {
            $or: [
              {
                $and: [
                  { $gt: [ "$$this.yearsExperience", 3 ] },
                  { $eq: [ "$$this.skill", "HTML" ]}
                ]
              },
              {
                $and: [
                  { $gt: [ "$$this.yearsExperience", 3] },
                  { $eq: [ "$$this.skill", "Git"] }
                ]
              }
            ]
          }
        }
      }
    }
  },
  {
    $addFields: {
      matchingSkills: "$$REMOVE",
      percentageMatch: {
        $multiply: [
          { $divide: [ { $size: "$matchingSkills" }, 2 ]}, // yu already know how many values you need to pass, thats' why `2`
          100
        ]
      }
    }
  }
])

Working 蒙戈游乐场

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

https://stackoverflow.com/questions/67580098

复制
相关文章

相似问题

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