Агрегация MongoDB - фильтрация подмассивов и проекция части их данных - PullRequest
0 голосов
/ 01 января 2019

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

Каждый документ содержит "книги" и "фильмы", но я не знаю, сколько из них.

{ 
    "_id" : 1, 
    "books" : [
        {
            "title" : "Philosopher's Stone", 
            "PopularVote" : 10, 
            "CriticsVote" : 9 
        },
        {
            "title" : "Chamber of Secrets", 
            "PopularVote" : 8, 
            "CriticsVote" : 6 
        },
        {
            "title" : "Prisoner of Azkaban", 
            "PopularVote" : 2, 
            "CriticsVote" : 10 
        }
    ],
    "movies" : [
        {
            "title" : "Goblet of Fire", 
            "PopularVote" : 5, 
            "CriticsVote" : 10 
        },
        {
            "title" : "Order of the Phoenix", 
            "PopularVote" : 8, 
            "CriticsVote" : 9 
        }
    ]       
}       

Я хочувыберите только те массивы, которые получили 10 на PopularVote ИЛИ CriticsVote, и спроецируйте только заголовок.Результат должен выглядеть следующим образом.

{ 
    "_id" : 1, 
    "books" : [
        {
            "title" : "Philosopher's Stone",  
        },
        {
            "title" : "Prisoner of Azkaban",  
        }
    ],
    "movies" : [
        {
            "title" : "Goblet of Fire", 
        }
    ]       
}    

Я перепробовал все виды комбинаций $filter и cond: но не получилось.

Спасибо!

пс ГарриПоклонники Поттера, это просто пример данных, который не отражает мое мнение о книгах и фильмах (-:

1 Ответ

0 голосов
/ 01 января 2019

Используйте $ addFields с $ filter для замены существующих books и movies с примененным условием фильтрации, а затем вы можете использовать $ project для получениятолько названия, попробуйте:

db.col.aggregate([
    {
        $addFields: {
            books: {
                $filter: {
                    input: "$books",
                    as: "b",
                    cond: {
                        $or: [
                            { $eq: [ "$$b.PopularVote", 10 ] },
                            { $eq: [ "$$b.CriticsVote", 10 ] }
                        ]
                    }
                }
            },
            movies: {
                $filter: {
                    input: "$movies",
                    as: "m",
                    cond: {
                        $or: [
                            { $eq: [ "$$m.PopularVote", 10 ] },
                            { $eq: [ "$$m.CriticsVote", 10 ] }
                        ]
                    }
                }
            }
        }
    },
    {
        $project: {
            "books.title": 1,
            "movies.title": 1
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...