Фильтровать только вложенный массив и возвращать целые документы, даже если критерии не соответствуют mongodb springdata - PullRequest
0 голосов
/ 31 октября 2019

Вот моя коллекция:

{
"_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")
    }
],
}

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

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

...