Найти / считать документы по частичному значению _id в MongoDB - PullRequest
0 голосов
/ 12 октября 2018

Я хочу найти документы в своих коллекциях по частичным значениям _id, которые я ввожу в приложении с графическим интерфейсом.
После некоторых поисков я обнаружил, что по крайней мере могу найти документы по их частичному идентификатору, используя следующий фильтр:

{ $where: "this._id.str.match(/5a.*/)" }

(где 5a - это частичное значение идентификатора, введенное пользователем)

Моё серверное приложение, которое обрабатывает эти запросы, также поддерживает разбиение на страницы, поэтому я всегда запрашиваю базу данных, чтобы подсчитать / оценить количествосоответствующие документы.
Однако, если я добавлю это $where выражение в мой FilterDefinition, который я передам CountDocumentsAsync() моей коллекции, я получу исключение:

MongoDB.Driver.MongoCommandException: Command aggregate failed: $where is not allowed in this context

Затем я посмотрел вверхcountDocuments метод MongoDB и обнаружил, что оператор $where недопустим в countDocuments(), и вместо него следует использовать $expr.

К сожалению, я не смог заставить что-либо работать с $exprпоскольку я не смог найти никаких полезных примеров, которые могли бы помочь мне с моими конкретными требованиями.
Я просто попытался обернуть выражение $where в выражение $expr bно это, похоже, не работает (Command aggregate failed: Unrecognized expression '$where')

Может кто-нибудь помочь мне в этом?

1 Ответ

0 голосов
/ 12 октября 2018

Предполагая, что ваш _id имеет тип ObjectId , вы можете преобразовать его в строку (доступно из v4.0 ), а затем пересмотреть его без использования дорогостоящей оценки JavaScript:

db.collection.aggregate([
    { $addFields: { 
        _idString: { $toString: "$_id" } 
    } },
    { $match: { _idString: /5a.*/ } }
] )

В качестве примечания, регулярное выражение /5a.*/ соответствует точно таким же строкам, что и /5a/.

...