Если вы хотите «весить» результаты по определенным критериям или иметь какое-либо «вычисленное значение» в «сортировке», тогда вам понадобится метод .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
не требуется только для того, чтобы соответствовать одному значению в массиве, и вам нужно только указать значение напрямую. Это цель, где «несколько» условий должны выполняться на одном элементе массива, что, конечно, здесь не применяется.
buffer-substring
вместе с region-beginning
и region-end
может сделать это.
Как starblue говорит, (buffer-substring (mark) (point))
возвраты содержание региона, если метка установлена. Если Вы не хотите эти свойства строки , можно использовать 'buffer-substring-no-properties
вариант.
Однако, если Вы пишете интерактивный команда, существует лучший способ получить конечные точки региона, с помощью формы (interactive "r")
. Вот пример от simple.el
:
(defun count-lines-region (start end) "Print number of lines and characters in the region." (interactive "r") (message "Region has %d lines, %d characters" (count-lines start end) (- end start)))
При вызове от кода Lisp, эти (interactive ...)
форма проигнорирована, таким образом, можно использовать эту функцию для подсчета строк в [1 113] любой часть буфера, не только регион, путем передачи соответствующих аргументов: например, (count-lines-region (point-min) (point-max))
для подсчета строк в суженной части буфера. Но при интерактивном вызове, эти (interactive ...)
форма оценена, и "r"
, код предоставляет точку и метку, как два числовых аргумента, самые маленькие сначала.
См. Руководство Lisp Emacs, разделы 21.2.1 Используя Интерактивный и 21.2.2 Кодовых символа для интерактивного .