Я думаю, вы ищете что-то подобное.
Входные документы:
{ "username" : "jack", "posts" : "hello world" }
{ "username" : "chris", "posts" : "java programming" }
{ "username" : "krish", "posts" : "mongo mongo" }
{ "username" : "john", "posts" : "rock-n-roll" }
Запрос:
db.users.aggregate( [
{
$facet: {
input_user: [
{ $match: { username: INPUT_NAME } }
],
other: [
{ $match: { username: { $ne: INPUT_NAME } } },
{ $sort: { username: 1 } }
]
}
},
{
$project: { result: { $concatArrays: [ "$input_user", "$other" ] } }
}
] )
Вывод:
Когда INPUT_NAME = 'john'
, то порядок username
: «john», «chris», «jack» и "Кри sh".
И, когда INPUT_NAME = 'some other'
, это: "Крис", "Джек", "Джон" и "Кри sh".
ПРИМЕЧАНИЕ: Приведенное выше решение отлично работает с небольшими коллекциями , но не будет использовать индексы, определенные для username
+ posts
поля - и это может привести к снижению производительности при работе с большими коллекциями.
Таким образом, можно использовать два запроса и объединить результаты. В таком случае индекс, определенный как этот, будет использоваться фильтром запроса, а также операциями сортировки: { username: 1, posts: 1 } }
.
Например:
let result_1 = db.users.find( { username: { $ne: INPUT_NAME } } ).sort( { username: 1, posts: 1 } ).toArray()
let result = db.users.find( { username: INPUT_NAME } ).sort( { username: 1, posts: 1 } ).toArray().concat(result_1)
Запросы могут быть агрегатами , что будет иметь преимущество в использовании большего количества памяти для операции сортировки. Индекс будет использоваться для операций сопоставления и сортировки.