#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"
}
Я покопался в документации и на онлайн-форумах, но не нашел ничего, что соответствовало бы этому конкретному варианту использования. Монго «левое соединение» — это не совсем то, что я хочу.
Вопрос
Есть ли способ написать представление с подзапросом таким образом, чтобы я получил ожидаемый результат выше?