2016-12-14 11 views
2

Я изо всех сил, чтобы найти хороший способ выполнения соединения MongoDB find() со следующими критериями:MongoDB: возвращает документ, если другой не существует

  • запрос будет соответствовать один документ на основе критериев поиска
  • Если совпадение найдено, этот документ будет возвращен
  • Если совпадение не найдено, в документе будет возвращен другой документ. Этот второй документ будет соответствовать другому набору критериев.
  • Запрос в идеале должен вернуть ровно одну запись независимо от того, что.

В моем конкретном случае у меня есть коллекция users, которая содержит список пользователей и связанные с ними разрешения. Он также содержит специальную запись для псевдо-пользователя guest, который содержит разрешения по умолчанию. Этот документ guest является тем, который необходимо вернуть, если точное совпадение пользователя не выполняется.

Я пробовал использовать {$or: [ { id: "bob" }, {id: "guest" } ]}, а также { id: { $in: [ "bob", "guest" ] } }, но оба эти поиска последовательно собираются и возвращают либо «боб», либо «гость», в зависимости от того, в который был вставлен первый.

Есть ли способ явно указать find bob или в качестве резервного, вернуть документ guest?

Имейте в виду, что это будет выполнено из Node.js, поэтому я ищу чистый & простой способ разгрузить это MongoDB.

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

Спасибо!

ответ

0

если вы введете guest в качестве первого объекта, то в сочетании limit и sort от _id вы можете решить это!

0

Я думаю, что вместо использования find ({}) вы можете использовать агрегат и в том, что оператор $ in и $ cond может решить вашу проблему. Вы можете обратиться к этой ссылке-> https://docs.mongodb.com/v3.2/reference/operator/aggregation/cond/

+0

Хмм, я не знал, что '$ cond' существует. Это может просто сделать это, хотя конечный результат будет очень долгим. Интересно, есть ли альтернативный способ без агрегации ... – mstubbies

Смежные вопросы