Проект агрегированного запроса Mongodb в массиве массивов

Я пробовал несколько разных ответов на форуме, но не помогло. Ниже приведен мой запрос, в котором у меня возникла проблема с «проектом для фильтрации» в $$this.star.email, где star — массив.

   db.groups.aggregate([{
        $match: {
        _id: 162
        }
    }, {
        $addFields: {
        member: {
            $arrayElemAt: [{
            $filter: {
                input: "$members",
                cond: {
                $eq: ["$$this.email", '[email protected]']
                },
            }
            }, 0]
        }
        }
    }, {
        $project: {
        messages: {
            $filter: {
            input: "$messages",
            cond: {
            $and: [    
                {$gte: ["$$this.ts", "$member.added"]},
                {$eq : ["$$this.star.email",'5fbf1fb7b8d11a1f510e7f54' ]}
            ]
            }

            
            }

        }
        }
    }]).toArray()

мой документ выглядит так. Я хочу отфильтровать messages наличие star с помощью email "5fbf1fb7b8d11a1f510e7f54". Приведенный выше запрос работает нормально, но не дает желаемого результата.

{
    "_id" : 162,
    "messages" : [
        {
            "c" : "df64",
            "ts" : ISODate("2020-12-16T04:39:15.707Z"),
            "email" : "5fbf1fb7b8d11a1f510e7f54",
            "groupId" : 162,
            "s" : "s",
            "star" : [
                {
                    "email" : "5fbf1fb7b8d11a1f510e7f54",
                    "ts" : "2020-12-16T04:39:18.612Z"
                }
            ]
        },
        {
            "c" : "df64780ed694",
            "ts" : ISODate("2020-12-16T04:22:24.621Z"),
            "email" : "5fbf1fb7b8d11a1f510e7f54",
            "groupId" : 162,
            "s" : "s",
            "star" : [ ]
        }
    ]
}
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
0
216
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

$$this.star.email вернет массив email, вы можете использовать условие $in внутри условия $filter,

cond: {
    $and: [
        { $gte: ["$$this.ts", "$member.added"] },
        { $in: ["5fbf1fb7b8d11a1f510e7f54", "$$this.star.email"] }
    ]
}

Детская площадка

Другие вопросы по теме