如果另一个字段不为空,我如何排序字段?



如果另一个字段不为空,我如何排序字段?我有如下数据,我想按pinOrder, pin,创建排序。但我想基于pinOrder排序,pin字段不为空,如果pin字段为空,仅按created排序数据。

聚合管道可以解决这个问题吗?

[
{
"id": "62b9c1d74321afff4cb4e652",
"created": "2022-06-27T14:42:31.726Z",
"pin": "2022-06-27T14:42:31.703Z",
"pin_order": 1
},
{
"id": "62b55d6ee0e1fa12861f8cb8",
"created": "2022-06-24T06:45:02.126Z",
"pin": null,
"pin_order": 1
},
{
"id": "629a212eda64722e286d29f6",
"created": "2022-06-03T14:56:46.980Z",
"pin": null,
"pin_order": 1
}
]

是的,这可以使用聚合管道来解决。如果您希望首先检索固定项,然后按创建顺序检索其余项,则可以使用以下管道(playground):

[
{
$set: {
"sortField": {
$cond: {
if: {
$ne: [
"$pin",
null
]
},
then: "$pin_order",
else: 9999999
}
}
}
},
{
$sort: {
sortField: 1,
created: 1
}
},
{
$unset: "sortField"
}
]

这个管道创建了一个用于排序的人工字段;如果一个项目被固定,则使用pin_order值,否则使用一个较大的值(高于预期的pin_order值),以便所有未固定的项目将被添加到固定的项目之后。

您可以通过使用一个较大的数字作为pin_order字段的默认值来优化这一点,而不是像示例数据中那样使用1。这样就不需要聚合管道,可以直接对数据进行排序。一旦一个项目被固定,你就给pin_order属性分配一个较低的值。

最新更新