Как создать представление Mongo с подзапросом?

#mongodb

Вопрос:

Ограничения

Я использую библиотеку Java, которая передает строку запроса collection.find() в query параметре. Я не могу обновить код Java и ничего не могу передать в projection параметре.

У меня есть контроль над базой данных и переданной строкой запроса.

Я использую Mongodb 3.6.

Подход

У меня есть данные, которые выглядят примерно так:

Коллекция grp

 {_id: 1, name: "grp1"}
{_id: 2, name: "grp2"}
{_id: 3, name: "grp3"}
 

Коллекция usr

 {_id: 1, username: "usr1", group: 1}
{_id: 2, username: "usr1", group: 2}
{_id: 3, username: "usr2", group: 2}
 

Мне нужно запросить это для одной группы и одного пользователя, чтобы я всегда получал группу и пользователя, если пользователь существует в группе.

Я создал следующее представление, которое почти дает мне то, что я хочу:

 db.createView(
  "groupView",
  "grp",
  [
    {
      $lookup: {
        from: "usr",
        localField: "_id",
        foreignField: "group",
        as: "u"
      }
    }, {
      $unwind: {
        path: "$u",
        preserveNullAndEmptyArrays: true
      }
    }, {
      $project: {
        "name": 1,
        "user": "$u"
      }
    }
  ]
)
 

Запрашивая представление, я могу получить это:

 > db.groupView.find({_id: 2, "user.username": "usr2"}).pretty()
{
    "_id" : 2,
    "name" : "grp2",
    "user" : {
        "_id" : 3,
        "username" : "usr2",
        "group" : 2
    }
}
 

However, if the user is not a member of the group, I still want the group.

 > db.groupView.find({_id: 2, "user.username": "usrNotFound"}).pretty()
 

From that query I’d like to at least get:

 {
    "_id" : 2,
    "name" : "grp2"
}
 

Я покопался в документации и на онлайн-форумах, но не нашел ничего, что соответствовало бы этому конкретному варианту использования. Монго «левое соединение» — это не совсем то, что я хочу.

Вопрос

Есть ли способ написать представление с подзапросом таким образом, чтобы я получил ожидаемый результат выше?