Mongodb条件排序

时间:2019-03-14 09:51:52

标签: mongodb mongoose

我想为sort子句添加一个字段,仅适用于一天前创建的那些文档。 假设在我的收藏集mycollection中,我的文档有一个字段publishDate和其他一些字段,下面是我的查询:

db.getCollection('mycollection').aggregate([                                                                                                                         
{
    "$match": {   
        "expireDate": {  
            "$gte": ISODate("2019-03-14T00:00:00.000Z")
        },
        "publishDate": {  
            "$lt": ISODate("2019-03-15T00:00:00.000Z")
        },
        "isPublished": true,     
        "isDrafted": false,  
        "deletedAt": {      
            "$eq": null   
        },
        "deleted": false,  
        "blocked": {     
            "$exists": false  
        }
    }
 },
 {
     "$sort": {    
         "isFeatured": -1,   // What I want is to add this field in sort clause by condition, when publishDate is yesterday, otherwise ignore it
         "refreshes.refreshAt": -1,  
         "publishDate": -1,   
         "_id": -1   
     }
 },
 {  
     "$skip": 0  
 },
 {   
     "$limit": 12  
 },
 {
     "$project": {
         "position": 1      
      }
 }])

1 个答案:

答案 0 :(得分:3)

创建一个虚拟字段,该字段表示应显示在列表顶部的条目的值,然后根据该字段对条目进行排序。您可以使用$addFields$cond运算符来完成它。

实现将是这样的:

// ...
{
  "$addField": {
    "isFeaturedSort": {
      "$cond": {
        "if": {
          "$and": {
            "publishDate": {
              "$gte": ISODate("2019-03-14T00:00:00.000Z"),
            },
            "$eq": ["isFeatured", true],
          },
        },
        "then": 1,
        "else": 0,
      },
    },
  },
},
{
  "$sort": {
    "isFeaturedSort": -1, // changed
    "refreshes.refreshAt": -1,
    "publishDate": -1,
    "_id": -1,
  },
},
// ...

请注意,$addField仅在MongoDB 3.4及更高版本中有效。 代码段中也可能包含错误。