如何在mongodb中获得前两名受薪员工

Posted

技术标签:

【中文标题】如何在mongodb中获得前两名受薪员工【英文标题】:How to get top two salaried employees in mongodb 【发布时间】:2021-11-24 12:58:18 【问题描述】:

我想根据一个部门的薪水获得前两名员工,

部门架构::

const departmentSchema = mongoose.Schema(
    name: 
        type: String
    ,
    employee_id: [ type: mongoose.Schema.Types.ObjectId, ref: 'employee' ]
)

员工架构 ::

const employeeSchema = mongoose.Schema(
    name: 
        type: String,
    ,
    salary : 
       type: Number
    
)

假设我在部门架构中有文档为 ::


    "_id":ObjectId("615851c162a012f82cc5bdf6"),
    "name":"abc",
    "employee_id":[ 
        ObjectId("615852d062a012f82cc5d54d"), 
        ObjectId("6158530462a012f82cc5d9c8"),
        ObjectID("6158530462a012f82cc8e1b9")
    ]

在员工中记录为 ::


    "_id":ObjectId("615852d062a012f82cc5d54d"),
    "name":"john",
    "salary":12345



    "_id":ObjectId("6158530462a012f82cc5d9c8"),
    "name":"smith",
    "salary":999



    "_id":ObjectId("6158530462a012f82cc8e1b9"),
    "name":"Alex",
    "salary":99999

基于此,我想根据薪水获取前两名员工的详细信息。

为此,我尝试如下:

   await department.aggregate([
         $match :  name : 'abc'  ,
    ]).populated('employee_id')

但它抛出错误填充不是一个函数。我如何才能像我在 mysql 中非常熟悉但不熟悉 mongodb 一样工作?如果有人需要任何进一步的信息,请告诉我。

预期响应为 ::

[
    
        "_id":ObjectId("6158530462a012f82cc8e1b9"),
        "name":"Alex",
        "salary":99999,
         department: abc
     ,
     
        "_id":ObjectId("615852d062a012f82cc5d54d"),
        "name":"john",
        "salary":12345,
        department: abc
      
]

【问题讨论】:

我认为如果你的employeeSchemadepartmentId 字段而不是你的departmentSchemaemployeeId IMO 的数组字段会更好 你的函数是populated。应该是populate 填充也给出同样的错误 我想与部门匹配,然后从该部门获取供应商列表。 这个问题似乎是 1) mongoose 填充语法错误和 2) mongodb 查询以获得前 2 名员工的混合体。对于问题 2),您可能会看到这个Mongo playground 看看它是否适合您的需要。 【参考方案1】:

您可以在聚合管道中执行以下操作:

    $match 选择预期的department 文档 $lookup 来自 employee 带有子管道的集合 在步骤 2 的子管道中,使用 $match 过滤掉预期的员工记录 在同一子管道中,$sort 按薪水和$limit 获得前 2 名员工 使用$addFields 将部门名称添加到员工对象中 $unwind子流水线结果 $replaceRoot获取员工文件

这是Mongo playground 供您参考。

【讨论】:

我可以再问一个问题还是应该创建一个新问题?我的查询:: 我可以在回复中也获得部门的名称吗? 由于您的更新似乎很小,我认为您只需更新原始问题中预期响应的格式即可。 更新了答案和游乐场链接

以上是关于如何在mongodb中获得前两名受薪员工的主要内容,如果未能解决你的问题,请参考以下文章

如何在数组的 mongodb 的子字段中进行聚合和分组?

sql中查询出一条数据如何将数据存在一个变量中

如何在数据保险库中存储非部分唯一的主键?

5年Go语言经验薪资翻倍! 这份全球职业报告中, 区块链开发者薪资排第三, 前两名你绝对想不到!(含完整版下载资源)

拥有灵魂的比亚迪和上汽取得前两名,特斯拉无奈屈居第三名

如何在 MongoDB 中获得简单的计数和分组?