MongoDB использует два раскручивания в агрегате для получения значения числа повторений - PullRequest
0 голосов
/ 24 октября 2018

У меня есть такой набор данных:

{
    "_id" : ObjectId("5bacc9295af10e2764648baa"),
    "slug" : ["Maruti", "Honda"],
    "page" : "Ford"
},
{
    "_id" : ObjectId("5bacc9295af10e2764648bab"),
    "slug" : ["Maruti", "Honda", "Tata"],
    "page" : "Hyundai"
},
{
    "_id" : ObjectId("5bacc9295af10e2764648bac"),
    "slug" : ["Maruti"],
    "page" : "Ford"
},
{
    "_id" : ObjectId("5bacc9295af10e2764648bad"),
    "slug" : ["Ford", "Hyundai"],
    "page" : "Tata"
}

Теперь, если я хочу получить число повторений страницы, я сделаю общий запрос следующим образом:

MyCollectionName.aggregate([
      { $unwind: { path: "$page" } },
      { $group: { _id: "$page", count: { $sum: 1 } } },
      {
        $project: {
          _id: 0,
          vehiclename: "$_id",
          count: { $multiply: ["$count", 1] }
        }
      },
      { $sort: { count: -1 } }
    ])
    .then(data => {
         console.log(data)
         //get the result like this which is fine
         [
           { vehiclename : 'Ford', count: 2},
           { vehiclename : 'Hyundai', count: 1},
           { vehiclename : 'Tata', count: 1}
         ]
     })
     .catch(e => {
       console.log(e)
      })

Аналогичноесли я сделаю для Slug, то мой запрос будет выглядеть так:

MyCollectionName.aggregate([
      { $unwind: { path: "$slug" } },
      { $group: { _id: "$slug", count: { $sum: 1 } } },
      {
        $project: {
          _id: 0,
          vehiclename: "$_id",
          count: { $multiply: ["$count", 1] }
        }
      },
      { $sort: { count: -1 } }
    ])
    .then(data => {
         console.log(data)
         //get the result like this which is fine
         [
           { vehiclename : 'Maruti', count: 3},
           { vehiclename : 'Honda', count: 2},
           { vehiclename : 'Tata', count: 1},
           { vehiclename : 'Ford', count: 1},
           { vehiclename : 'Hyundai', count: 1}
         ]
     })
     .catch(e => {
       console.log(e)
      })

Теперь я хочу сделать это для одного запроса вместо отдельного запроса.

Я немного запутался в использовании размотки и после получения значения обеих комбинаций в одном запросе.

Желаемый результат будет выглядеть так:

[
 { vehiclename : 'Maruti', count: 3},
 { vehiclename : 'Ford', count: 3},
 { vehiclename : 'Honda', count: 2},
 { vehiclename : 'Tata', count: 2},        
 { vehiclename : 'Hyundai', count: 1}
]

Любая помощьдействительно ценится.

1 Ответ

0 голосов
/ 24 октября 2018

Я получил решение.Пожалуйста, сообщите, если я делаю что-то не так ..

MyCollectionName.aggregate([
      {
        $facet: {
          groupByPage: [
            { $unwind: "$page" },
            {
              $group: {
                _id: "$page",
                count: { $sum: 1 }
              }
            }
          ],
          groupBySlug: [
            { $unwind: "$slug" },
            {
              $group: {
                _id: "$slug",
                count: { $sum: 1 }
              }
            }
          ]
        }
      },
      {
        $project: {
          pages: {
            $concatArrays: ["$groupByPage", "$groupBySlug"]
          }
        }
      },
      { $unwind: "$pages" },
      {
        $group: {
          _id: "$pages._id",
          count: { $sum: "$pages.count" }
        }
      },
      { $sort: { count: -1 } }
    ])
    .then(data => {
         console.log(data)             
     })
     .catch(e => {
       console.log(e)
      })
...