在mongo中执行优先查询

Posted

技术标签:

【中文标题】在mongo中执行优先查询【英文标题】:performing query with priority in mongo 【发布时间】:2016-01-12 06:12:21 【问题描述】:

示例文档:

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

例子:

    John 和 Jane 于 3 月加入 亚当、约翰和鲍勃是主管 上面提到的所有员工以及 Lee 都不是马来西亚人

预期结果是:

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

上面的方括号是为了表明同一个方括号内的顺序无关紧要。所以 Jane 也可能出现在 John 之前(因为它们的条件相同)。但 John 和 Jane 都必须出现在 Adam 和 Bob 之前,因为 join_month=3 的优先级高于 level=supervisor。并且还要注意,即使 John 也满足 level=supervisor 标准,他也不会再次被包括在内,因为他已经满足 join_month=3。

这在 MongoDB 中可行吗?

【问题讨论】:

【参考方案1】:

在您的 SQL 查询中,您不需要 UNION 运算符,因为您从同一个表中进行选择。您应该使用OR 运算符。 MongoDB 提供了一个 $or 运算符,它可以满足您的需求。

您的 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 
)

您需要的一切都在文档中。你应该从官方MongoDB CRUD Tutorials开始,看看SQL to MongoDB Mapping Chart

如果要根据某些字段值对结果进行排序,则需要使用.aggregate() 方法,该方法提供对聚合管道的访问。管道中的第一个阶段是$match 阶段,您只选择那些符合您的条件的文档。这也减少了要在下一阶段处理的文档的大小,即此处的$project 阶段,您使用$cond 运算符返回一个字段的值,您将使用该字段对@987654328 中的查询结果进行排序@ 阶段。这个过程叫做"weighting"

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  
])

【讨论】:

【参考方案2】:

如果您需要排序,您可以使用如下聚合。

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);

【讨论】:

以上是关于在mongo中执行优先查询的主要内容,如果未能解决你的问题,请参考以下文章

Mongo $or 查询范围是在内存中排序吗?

Mongodb:从 mongo shell 中的 ObjectId 执行日期范围查询

mongo explain分析详解

MongoDB hadoop 连接器无法在 mongo hive 表上查询

python-day43--单表查询之关键字执行优先级(重点)

您如何在 Mongo 中查询“不为空”?