Вы можете "сортировать по базе данных", используя .aggregate()
let results = await Account.aggregate([
{ "$match": {
"$or": [
{ "argA": account.argA },
{ "argB": account.argB },
{ "argC": account.argC }
],
"_id": { "$ne": account._id}
}},
{ "$addFields": {
"rank": {
"$sum": [
{ "$cond": [{ "$eq": ["$argA", account.argA] }, 3, 0 ] },
{ "$cond": [{ "$eq": ["$argB", account.argB] }, 2, 0 ] },
{ "$cond": [{ "$eq": ["$argC", account.argC] }, 1, 0 ] }
]
}
}},
{ "$sort": { "rank": -1 } }
/*
* Add $skip and $limit for paging if needed
{ "$skip": 0 },
{ "$limit": 25 },
*/
])
Также отметим, что Account.aggregate()
или Account.find()
на самом деле возвращает Promise
, поскольку метод асинхронный, поэтому вам нужно await
или использовать .then()
или предоставить обратный вызов, в зависимости от вашего предпочтительного стиля:
Account.aggregate([
{ "$match": {
"$or": [
{ "argA": account.argA },
{ "argB": account.argB },
{ "argC": account.argC }
],
"_id": { "$ne": account._id}
}},
{ "$addFields": {
"rank": {
"$sum": [
{ "$cond": [{ "$eq": ["$argA", account.argA] }, 3, 0 ] },
{ "$cond": [{ "$eq": ["$argB", account.argB] }, 2, 0 ] },
{ "$cond": [{ "$eq": ["$argC", account.argC] }, 1, 0 ] }
]
}
}},
{ "$sort": { "rank": -1 } }
/*
* Add $skip and $limit for paging if needed
{ "$skip": 0 },
{ "$limit": 25 },
*/
]).then( result => /* do something */ )
Это разрешение обещания / обратного вызова является основной ошибкой в вашем коде.
Но суть в том, что вы, вероятно, хотите вычислить "rank"
на сервере , чтобы включить подкачку по большим наборам результатов, и это намного умнее, чем пытаться отсортировать "все" в массиве результатов.