MongoDB,如何将查找和排序与聚合中的 $cond 结合起来?

Posted

技术标签:

【中文标题】MongoDB,如何将查找和排序与聚合中的 $cond 结合起来?【英文标题】:MongoDB, How Do I combine a find and sort with the $cond in aggregation? 【发布时间】:2020-07-04 11:21:53 【问题描述】:

我写了一个查找查询,它有效,查找查询返回名称和级别存在的记录

db.docs.find(  $and: [name:$exists:true,level: $exists:true ] ,_id:0, name:1).sort("name":1)

现在想将它与下面的代码结合起来,它也可以工作,但需要与上面的代码合并以提取正确的数据

db.docs.aggregate(
   [
      
         $project:
           
             _id:0,
             name: 1,
             Honours:
               
                 $cond:  if:  $gte: [ "$level", 8 ] , then: "True", else: "False" 
               
           
      
   ]
)

find 查询返回 name 和 level 存在的记录,但我需要使用名为 Honours 的新列来增强结果,根据 level 是否为 gte(大于或等于 8)显示 True of False

所以我基本上试图将上面的 find 过滤器与 $cond 函数结合起来(我在这里找到并修改了示例:$cond)

我尝试了以下和其他一些排列来尝试使用 $project 和 $cond 聚合进行查找和排序,但它返回了错误。我对如何构建 mongodb 语法以使其完全融合在一起非常陌生。有人可以帮忙吗?

db.docs.aggregate(
   [ $and: [name:$exists:true,level: $exists:true ] ,_id:0, name:1).sort("name":1
      
         $project:
           
             _id:0,
             name: 1,
             Honours:
               
                 $cond:  if:  $gte: [ "$level", 8 ] , then: "True", else: "False" 
               
           
      

   ]
)

【问题讨论】:

【参考方案1】:

试试下面的聚合管道:

db.docs.aggregate([
  /** $match is used to filter docs kind of .find(), lessen the dataset size for further stages */
  
    $match: 
      $and: [ name:  $exists: true  ,  level:  $exists: true  ]
    
  ,
  /** $project works as projection - w.r.t. this projection it will lessen the each document size for further stages */
  
    $project: 
      _id: 0,
      name: 1,
      Honours: 
        $cond:  if:  $gte: ["$level", 8] , then: "True", else: "False" 
      
    
  ,
  /** $sort should work as .sort() */
   $sort:  name: 1  
]);

【讨论】:

以上是关于MongoDB,如何将查找和排序与聚合中的 $cond 结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb:聚合排序限制查询的索引?

mongoDB表与表的关系及聚合管道查询

为啥在与数组中的字段匹配时,mongoDB聚合中的查找中的管道不起作用?

如何使用聚合 MongoDB 查找具有两列的不同字段

如何使用MongoDB聚合进行分页?

mongodb Aggregation聚合操作之$sort