какие ветви mongodb $ или запроса были удовлетворены для включения документа в возвращенный набор?

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

Допустим, у меня есть mongo $ или запрос, что-то вроде { $or: [query1, query2, ... queryN] } , где каждый встроенный запрос может быть сложным. После выполнения запроса возвращается набор документов, соответствующий одному или нескольким встроенным запросам. Я хотел бы знать, какой из N встроенных запросов был удовлетворен для каждого документа в возвращенном наборе, возможно, путем добавления нового поля, которое я указываю, например. marks , в каждый возвращенный документ, который будет содержать список индексов того, какой из запросов был удовлетворен. Мне нужна эта информация, чтобы указать, как каждый документ был идентифицирован в интерфейсе моего приложения.

Я понимаю, что мог бы проверить набор после его возврата и определить запросы, которые были удовлетворены, но эти запросы могут быть произвольно сложными и дорогостоящими для проверки — кроме того, это, должно быть, уже было сделано внутри самого mongo во время выполнения поиска.

Я также понимаю, что мог бы последовательно запускать каждый из N запросов, а затем отмечать и объединять результаты в растущий набор, но я хочу сэкономить эти накладные расходы, выполнив один запрос вместо N запросов.

И я понимаю, что Mongo, безусловно, остановится, как только будет найден первый удовлетворяющий запрос для каждого документа, поэтому я, возможно, не смогу получить полный набор, но тогда я хотел бы, по крайней мере, получить некоторую уверенность в том, что запросы выполняются в определенном порядке, скажем, 1 … N, и каждый документ может быть помечен его первым удовлетворяющим индексом.

Кто-нибудь знает, есть ли в Mongo механизм, который может это сделать?

Ответ №1:

Вы можете использовать агрегацию.

Используйте $addFields для добавления нового поля для каждого запроса.

Вы могли бы либо $match сначала, а затем добавить поля, либо сначала добавить поля и добавить добавленные поля.