агрегация mongodb на больших данных, как ограничить pu sh в группе? - PullRequest
2 голосов
/ 22 апреля 2020

мои данные в коллекции: любое имя имеет значение для образца:

{
    "name" : "kamal",
    "val" : 5
}
{
    "name" : "ali",
    "val" : 3
}
{
    "name" : "mohammad",
    "val" : 12
}
{
    "name" : "kamal",
    "val" : 6
}
{
    "name" : "kamal",
    "val" : 10
}
{
    "name" : "ali",
    "val" : 11
}
{
    "name" : "mohammad",
    "val" : 9
}
{
    "name" : "mohammad",
    "val" : 19
}
{    
    "name" : "ali",
    "val" : 6
}

В моей коллекции 20000000 документов. и это вырасти 1000000 в день, пожалуйста, помогите мне решить эту проблему. этот конвейер в работе mongodb:

db.test.aggregate([
    {$group:{
            _id:$name,
            vals:{$push:$val}
        }
    }
])

добавить все значения val для любого имени, но ограничение памяти больших данных не работает. Мне нужно это: Мне нужно в групповом пределе pu sh Количество данных.

db.test.aggregate([
    {$group:{
            _id:$name,
            vals:{$push:$val , $limit:500000}
        }
    }
])

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Невозможно

Возможное решение (MongoDB> = v3.6): Это решение может работать для вас, но оно имеет очень низкую производительность.

Примечание: 500.000 val / name может превышать ограничение 16 МБ

db.test.aggregate([
  {
    $group: {
      _id: "$name"
    }
  },
  {
    $lookup: {
      from: "test",
      let: {
        username: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$$username",
                "$name"
              ]
            }
          }
        },
        {
          $project: {
            _id: 0,
            val: 1
          }
        },
        {
          $limit: 500000
        }
      ],
      as: "vals"
    }
  },
  {
    $project: {
      vals: {
        $map: {
          input: "$vals",
          in: "$$this.val"
        }
      }
    }
  }
],{allowDiskUse:true})

MongoPlayground

0 голосов
/ 22 апреля 2020

Нет решения для магов c, которое сделает $group "быстрым" при увеличении масштаба.

Существует несколько подходов к работе со шкалой:

  1. Обновление оборудования, это, очевидно, не очень эффективно, так как масштаб продолжает расти, и вам придется постоянно обновлять оборудование, чтобы не отставать. однако в определенные моменты это необходимо учитывать.

  2. Изменить архитектуру: я не уверен, как строится ваша база данных, но при определенных потребностях это может действительно ускорить выполнение некоторых запросов, данные отгружены? если это так, то осколок правильно? вероятно, есть много изменений, которые вы можете сделать, чтобы соответствовать вашим потребностям, но мне еще предстоит увидеть идеально настроенную архитектуру, где я бы сказал, что нет ничего, что можно изменить для повышения производительности.

  3. Самый простой из них все используют предварительную обработку для подготовки данных. Что это значит? это означает, что мы создаем новую коллекцию, которая будет {name: string, vals: {val: number, count: number}, теперь, когда вы вставляете или обновляете один из ваших документов, вам также необходимо обновить эту коллекцию, что создаст некоторые накладные расходы, но это единственное решение, которое работает без грандиозные изменения и несколько прост в реализации.

...