Группа агрегации MongoDB по похожей строке - PullRequest
0 голосов
/ 27 сентября 2018

Я начинаю изучать агрегаты для Mongo, но для своего проекта я нашел много брендов в своей коллекции с очень похожими названиями, таких как «BrandA» и «BrandA tech».Есть ли способ сгруппировать их в конце моей агрегации?

У меня есть 2 коллекции в моей базе данных:

Первая для брендов:

{
  _id: ObjectId(),
  name: String
}

Второй - для продуктов:

{
  _id: ObjectId(),
  name: String,
  brand: ObjectId() // referring to _id of brands
}

Теперь предположим, что у меня есть следующие бренды:

{_id: ObjectId('5a9fd2b8045b020013de2a47'), name: 'brand1'},
{_id: ObjectId('5a9fcf94d28420245451a39c'), name: 'brand2'},
{_id: ObjectId('5a9fcf94d28420245451a39a'), name: 'brand1 sub1'},
{_id: ObjectId('5a9fe8bf045b020013de2a6d'), name: 'sub2 brand2'}

И следующие продукты:

{_id: ObjectId(''), name: 'item1', brand: ObjectId('5a9fd2b8045b020013de2a47')},
{_id: ObjectId(''), name: 'item2', brand: ObjectId('5a9fcf94d28420245451a39c')},
{_id: ObjectId(''), name: 'item3', brand: ObjectId('5a9fd2b8045b020013de2a47')},
{_id: ObjectId(''), name: 'item4', brand: ObjectId('5a9fcf94d28420245451a39a')},
{_id: ObjectId(''), name: 'item5', brand: ObjectId('5a9fe8bf045b020013de2a6d')},
{_id: ObjectId(''), name: 'item6', brand: ObjectId('5a9fd2b8045b020013de2a47')},
{_id: ObjectId(''), name: 'item7', brand: ObjectId('5a9fcf94d28420245451a39c')},
{_id: ObjectId(''), name: 'item8', brand: ObjectId('5a9fcf94d28420245451a39a')}

ЗапросУ меня сейчас:

db.getCollection('products').aggregate([
  {$group: {
    _id: '$brand',
    amount: { $sum: 1 },
  }},
  {
    $sort: { 'amount': -1 }
  },{$lookup: {
    from: 'brands',
    localField: '_id',
    foreignField: '_id',
    as: 'lookup'
  }},
  {$unwind: {path: '$lookup'}},
  {$project: {
    _id: '$_id',
    brandName: '$lookup.name',
    amount: '$amount'
  }}
]);

Результат:

{_id: ObjectId('5a9fd2b8045b020013de2a47'), brandName: 'brand1', amount: 3}
{_id: ObjectId('5a9fcf94d28420245451a39c'), brandName: 'brand2', amount: 2}
{_id: ObjectId('5a9fcf94d28420245451a39a'), brandName: 'brand1 sub1', amount: 2}
{_id: ObjectId('5a9fe8bf045b020013de2a6d'), brandName: 'sub2 brand2', amount: 1}

Результат, который я хочу:

{_id: ObjectId(null), brandName: 'brand1', amount: 5},
{_id: ObjectId(null), brandName: 'brand2', amount: 3}

Можно ли сгруппировать результат, который я имею сейчас, найдяпохожие строки в brandName?Как группировка «brand1» и «brand1 sub1» или «brand2» и «sub2 brand2»?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

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

0 голосов
/ 27 сентября 2018

Я думаю, что вы могли бы делать то, что вы хотите, используя $ split и $ unwind

split преобразует вашу строку в массив слов иunwind создаст столько записей, сколько у вас есть слов в массиве.

Затем вы можете применить уже подготовленный конвейер для подсчета вхождений.

...