Как сопоставить элемент из списка - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь отобразить элементы, которые имеют c название бренда. Вот как выглядит это поле:

    "brand" : [ 
    [ 
        "Samsung", 
        "Iphone", 
        "Huawei" 
    ]
]

Пробовал этот запрос, но я получаю 0 результатов:

db.collection.aggregate([{$match: { brand: "Samsung" }}])

Есть идеи, что не так?

1 Ответ

1 голос
/ 06 марта 2020

Ваша модель данных представляет собой массив массивов , поэтому вам приходится иметь дело с двумя измерениями. Вы можете сначала использовать $ map вместе с $ in , а затем использовать $ anyElementTrue , чтобы увидеть, есть ли какой-либо под-массив, соответствующий вашему условию:

db.collection.aggregate([
    {
        $match: {
            $expr: {
                $anyElementTrue: {
                    $map: {
                        input: "$brand",
                        in: { $in: [ "Samsung", "$$this" ] }
                    }
                }
            }
        }    
    },
    {
        $project: {
             _id: 1,
             color: 1
        }
    }
]);

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

РЕДАКТИРОВАТЬ: используйте $ project для отображения только определенных полей

...