由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
的单个特定文档放在查询结果的顶部?
答案 0 :(得分:2)
您可以尝试以下操作:
itemsCollection.aggregate([
{
"$project": {
"_id": 1,
"category": 1,
"title": 1,
"priority": {
"$eq": [
"$_id",
2
]
}
}
},
{
"$sort": {
"priority": -1
}
}
])
基本上,我们正在创建一个合成属性priority
,当true
是一个匹配项时,该属性将设置为_id
。最后,我们按priority
排序以返回匹配项-由_id
匹配的文档将在最上面,然后是其余的。