Вот моя коллекция:
{
"_id" : "id",
"name" : "group1",
"groupUsers" : [
{
"userId" : "userId",
"name" : "User1",
"toys" : [
{
"_id" : "toyUser1",
"subject" : "toyUser1",
"createdAt" : ISODate("2019-11-01T16:57:58.381Z"),
}
],
"sharedToys" : [
{
"_id" : "toyUser2",
"subject" : "toyUser2",
"createdAt" : ISODate("2019-10-30T16:57:58.381Z"),
}
],
"role" : "ADMIN",
"createdAt" : ISODate("2019-10-30T16:57:35.871Z")
},
{
"userId" : "userId",
"name" : "User2",
"toys" : [
{
"_id" : "toyUser2",
"subject" : "toyUser2",
"createdAt" : ISODate("2019-10-30T16:57:58.381Z"),
}
],
"sharedToys" : [],
"role" : "MEMBER",
"createdAt" : ISODate("2019-10-30T16:59:35.089Z")
}
],
}
Когда пользователь запрашивает информацию о группе, она должна удовлетворять нескольким условиям:
Сначала я просто получаю основную информацию о пользователе, который запускает API,Например, User1 введите в группе:
Aggregation groupAgg = newAggregation(match(Criteria.where("_id").is(groupId).and("groupUsers.userId").is(userId)));
GroupUser groupUser = mongoTemplate.aggregate(groupAgg, Group.class, GroupUser.class).getUniqueMappedResult();
Существует два основных условия;Первый, для каждого пользователя, которого я хочу , массив игрушек содержит только игрушку, созданную после создания текущего пользователя . Второе, все еще на массиве toys, состоит в том, чтобы не использовать sharedToys моего текущего пользователя в массиве игрушек других пользователей . Те два условия, когда user1 запрашивает информацию о группе, дадут мне:
{
"_id" : "id",
"name" : "group1",
"groupUsers" : [
{
"userId" : "userId",
"name" : "User1",
"toys" : [
{
"_id" : "toyUser1",
"subject" : "toyUser1",
"createdAt" : ISODate("2019-11-01T16:57:58.381Z"),
}
],
"sharedToys" : [
{
"_id" : "toyUser2",
"subject" : "toyUser2",
"createdAt" : ISODate("2019-10-30T16:57:58.381Z"),
}
],
"role" : "ADMIN",
"createdAt" : ISODate("2019-10-30T16:57:35.871Z")
},
{
"userId" : "userId",
"name" : "User2",
"toys" : [],
"sharedToys" : [],
"role" : "MEMBER",
"createdAt" : ISODate("2019-10-30T16:59:35.089Z")
}
],
}
Игрушки, созданные user2, удалены, потому что currentUser уже получил эту игрушку в его sharedToys. Я думаю, что запрос будет содержать что-то подобное something.gte(groupUser.getCreatedAt())
для первого условия и something.nin(groupUser.getSharedToys())
для второго.
И еще одна вещь, если, например, user2 еще не создал игрушек, поэтому массив пуст, он все равно должен вернуть весь документ. Например:
{
"_id" : "id",
"name" : "group1",
"groupUsers" : [
{
"userId" : "userId",
"name" : "User1",
"toys" : [
{
"_id" : "toyUser1",
"subject" : "toyUser1",
"createdAt" : ISODate("2019-11-01T16:57:58.381Z"),
},
{
"_id" : "toyUser1",
"subject" : "toyUser1",
"createdAt" : ISODate("2019-10-29T16:57:58.381Z"),
},
{
"_id" : "toyUser1",
"subject" : "toyUser1",
"createdAt" : ISODate("2019-10-29T16:57:58.381Z"),
}
],
"sharedToys" : [],
"role" : "ADMIN",
"createdAt" : ISODate("2019-10-28T16:57:35.871Z")
},
{
"userId" : "userId",
"name" : "User2",
"toys" : [],
"sharedToys" : [],
"role" : "MEMBER",
"createdAt" : ISODate("2019-10-30T16:59:35.089Z")
}
],
}
должен возвращать
{
"_id" : "id",
"name" : "group1",
"groupUsers" : [
{
"userId" : "userId",
"name" : "User1",
"toys" : [
{
"_id" : "toyUser1",
"subject" : "toyUser1",
"createdAt" : ISODate("2019-11-01T16:57:58.381Z"),
}
],
"sharedToys" : [],
"role" : "ADMIN",
"createdAt" : ISODate("2019-10-30T16:57:35.871Z")
},
{
"userId" : "userId",
"name" : "User2",
"toys" : [],
"sharedToys" : [],
"role" : "MEMBER",
"createdAt" : ISODate("2019-10-30T16:59:35.089Z")
}
],
}
Я использую моно весенних данных, поэтому я бы предпочел использовать такой язык для агрегации.
Я предполагаю сначала добавить критерии для получения правильного идентификатора группы, затем вернуть весь документ, но отфильтровать только вложенные массивы игрушек с условиями, которые я описал ранее, но я понятия не имею, как это сделать. Спасибо за вашу помощь