MongoDB - фильтр условий и 3-х глубоких объектов - PullRequest
0 голосов
/ 16 февраля 2019

Мне нужно получить все документы, где translations.proposedTranslation существует, но translations.proposedTranslation.translator нет, хотя бы в одном из объектов в массиве translations.

Эти документы должны быть выбранным:

{
    translations: [{
        language: "spanish",
        proposedTranslation: {
            user: "123456789"
        }
    }]
}
//and
{
    translations: [{
        language: "spanish",
        proposedTranslation: {
            user: "123456789"
        }
    }, {
        language: "french",
        proposedTranslation: {
            user: "123456789",
            translator: "987654321"
        }
    }]
}

Этот должен не :

{
    translations: [{
        language: "spanish",
        proposedTranslation: {
            user: "123456789",
            translator: "987654321"
        }
    }]
}

Вот что у меня есть:

$expr: {
    $gte: [
        {
            $size: {
                $filter: {
                    input: "$translations",
                    cond: {
                        $and: [
                            {
                                $ne: ["$$this.proposedTranslation", null]
                            },
                            {
                                $eq: ["$$this.proposedTranslation.translator", null]
                            }
                        ]
                    }
                }
            }
        },
        1
    ]
}

Однако это не возвращает никаких документов.Я думаю, что это из-за $eq: ["$$this.proposedTranslation.translator", null], так как он работает, как и должно, если я пропущу эту строку.Есть ли что-то, что мне нужно изменить, так как это объект глубиной 3?

1 Ответ

0 голосов
/ 17 февраля 2019

Вот что исправило это для меня, поскольку я обнаружил, что проблема на самом деле заключалась в том, как я проверял, является ли поле пустым или нет:

$expr: {
    $gte: [
        {
            $size: {
                $filter: {
                    input: "$translations",
                    cond: {
                        $and: [
                            {
                                $ifNull: ["$$this.proposedTranslation", false]
                            },
                            {
                                $not: [{ $ifNull: ["$$this.proposedTranslation.translator", false] }]
                            }
                        ]
                    }
                }
            }
        },
        1
    ]
}
...