Если вы хотите «весить» результаты по определенным критериям или иметь какое-либо «вычисленное значение» в «сортировке», тогда вам понадобится метод .aggregate()
. Это позволяет использовать «прогнозируемые» значения в операции $sort
, для которой может использоваться только настоящее поле в документе:
db.messages.aggregate([
{ "$match": { "messages": userId } },
{ "$project": {
"recipients": 1,
"unread": 1,
"content": 1,
"readYet": {
"$setIsSubset": [ [userId], "$unread" ] }
}
}},
{ "$sort": { "readYet": -1 } },
{ "$limit": 20 }
])
Здесь $setIsSubset
позволяет сопоставить «непрочитанный» массив с преобразованным массивом [userId]
, чтобы увидеть, имеются ли какие-либо совпадения. Результат будет либо true
, где существует userId, либо false
, где это не так.
Затем это можно передать в $sort
, который заказывает результаты с предпочтениями совпадений (сортировка сортировки является true
сверху), и, наконец, $limit
просто возвращает результаты до указанной суммы.
Итак, чтобы использовать заданный термин для «сортировки», значение должно быть «проецировано» в документ, чтобы его можно было отсортировать. Структура агрегации - это то, как вы это делаете.
Также обратите внимание, что $elemMatch
не требуется только для того, чтобы соответствовать одному значению в массиве, и вам нужно только указать значение напрямую. Это цель, где «несколько» условий должны выполняться на одном элементе массива, что, конечно, здесь не применяется.
blockquote>Node* newNode;
Вы по умолчанию инициализировали указатель. Значение будет неопределенным. Поведение чтения неопределенного значения не определено.
blockquote>newNode->value = valueInput;
Вы непрямой через неопределенный указатель. Поведение программы не определено.