在mongo中执行优先级查询

时间:2016-01-12 06:12:22

标签: sql mongodb mongodb-query aggregation-framework

示例文档:

{"name":"John", "age":35, "level":"trainee",.....}
  1. 其join_month = 3为最高优先级的员工(此类别的员工首先出现)
  2. 作为主管的员工是第二优先(出现在#1中的所有员工之后)
  3. 非马来西亚人的员工优先级最低(出现在所有其他员工之后)
  4. 示例:

    1. John和Jane三月加入
    2. Adam,John和Bob是主管
    3. 上面提到的所有员工以及Lee都不是马来西亚人
    4. 预期结果是:

      [John, Jane], [Adam, Bob], [Lee]
      

      上面的方括号表示同一方括号内的顺序无关紧要。所以简也可能出现在约翰面前(因为他们处于相同的标准)。但John和Jane必须出现在Adam和Bob之前,因为join_month = 3具有更高的优先级,即level = supervisor。并且还注意到即使约翰也符合等级=主管标准,他也没有再次被包括在内,因为他已经遇到了join_month = 3.

      这在MongoDB中是可行的吗?

2 个答案:

答案 0 :(得分:0)

如您需要订购,您可以使用以下聚合。

pipeline = [
  {
    $match: {$or: [{join_months: 3}, {level: 'Supervisor'}, {nationality: {$ne: 'MY'}}
                  ]}
  },
  {
    $project: {
      name: 1,
      age: 1,
      join_priority: {$cond: [{$eq: ['$join_months', 3]}, 1, 0]},
      leve_priority: {$cond: [{$eq: ['$level', 'supervisor']}, 1, 0]},
    }
  },
  {
    $sort: {join_priority: -1, level_priority: -1}
  }
];
db.mycollection.aggregate(pipeline);

答案 1 :(得分:0)

在SQL查询中,您不需要UNION运算符,因为您从同一个表中进行选择。您应该使用OR运算符。 MongoDB提供了一个MongoDB CRUD Tutorials运算符,可以执行您想要的操作。

您的SQL查询:

SELECT NAME, AGE FROM EMPLOYEE 
WHERE JOIN_MONTH=3
OR LEVEL='SUPERVISOR'
OR NATIONALITY <> 'MY'

在MongoDB中:

db.EMPLOYEE.find( { 
    "$or": [ 
        { "join_month": 3 }, 
        { "level": "supervisor" }, 
        { "nationality": { "$ne": "my" } } 
     ] },
     { "name": 1, "_id": 0, "age": 1 }
)

您需要的一切都在文档中。您应该从官方SQL to MongoDB Mapping Chart开始,然后查看.aggregate()

如果要根据某些字段值对结果进行排序,则需要使用$match方法来提供对聚合管道的访问。管道中的第一个阶段是$project阶段,您只选择符合条件的文档。这也减少了下一阶段要处理的文档的大小,这是$cond阶段,您使用$sort运算符返回将用于对查询结果进行排序的字段的值在"weighting"阶段。此过程称为{{3}}

db.collection.aggregate([
    { "$match": { 
        "$or": [ 
            { "join_month": 3 }, 
            { "level": "supervisor" }, 
            { "nationality": { "$ne": "MY" } }
        ] 
    }}, 
    { "$project": { 
        "name": 1, 
        "age": 1,
        "_id": 0, 
        "criteria": { 
            "$cond": [ 
               { "$eq": [ "$join_month",  3 ] }, 
               3, 
               { "$cond": [ 
                   { "$eq": [ "$level", "supervisor" ] }, 
                   2 , 
                   1 
               ] } 
            ] 
        } 
    }}, 
    { "$sort":  { "criteria": -1 } }
])