MongoDB:排序,但结果中带有特定的文档?

时间:2019-01-22 22:41:30

标签: mongodb mongoose mongodb-query aggregation-framework

由MGMT和销售人员共同设定的要求是,查询结果应包含一个特定的文档作为第一个结果,然后是与查询匹配的所有其他文档。

这是我的数据的非常简化的示例:

{ _id: 1,
title: 'other item',
category: 'show'
}
{ _id: 2,
title: 'THE ITEM THAT MUST BE RETURNED FIRST',
category: 'show'
}
{ _id: 3,
title: 'other item 2',
category: 'show'
}
{ _id: 4,
title: 'item not matching query',
category: 'hide'
}

在此示例中,我在http请求主体中传递了id的值{ _id : 2 },我需要查询与某些条件{ category: 'show' }相匹配的所有其他文档。此示例,但带有id == 2的文章必须是返回的第一个文档:

//pseudo-code. I know this is not even close
itemsCollection.aggregate([
{ $match : { category: 'show'} }
// sort, but with item with id == 2 at top, and the rest sorted by title ASC
{ $sort : { {item_with_id_2: first_returned }, {title: 1} }
])

上面是我需要结果看起来像的伪代码:

{ _id: 2,
title: 'THE ITEM THAT MUST BE RETURNED FIRST',
category: 'show'
}
{ _id: 1,
title: 'other item',
category: 'show'
}
{ _id: 3,
title: 'other item 2',
category: 'show'
}

如何强制将我拥有id的单个特定文档放在查询结果的顶部?

1 个答案:

答案 0 :(得分:2)

您可以尝试以下操作:

itemsCollection.aggregate([
  {
    "$project": {
      "_id": 1,
      "category": 1,
      "title": 1,
      "priority": {
        "$eq": [
          "$_id",
          2
        ]
      }
    }
  },
  {
    "$sort": {
      "priority": -1
    }
  }
])

基本上,我们正在创建一个合成属性priority,当true是一个匹配项时,该属性将设置为_id。最后,我们按priority排序以返回匹配项-由_id匹配的文档将在最上面,然后是其余的。