Группировать MongoDB и сортировать по ключу

#mongodb

#mongodb

Вопрос:

У меня есть коллекция mongodb с такими данными, как:

 {
    "_id" : "100",
    "deleted" : false,
    "alphanumericKey" : "s",
    "sortName" : "stackoverflow",
     "name" : [ 
        {
            "value" : "Stack Overflow",
            "language" : "en"
        }
    ]
}
{
    "_id" : "101",
    "deleted" : false,
    "alphanumericKey" : "s",
    "sortName" : "something",
     "name" : [ 
        {
            "value" : "Something else with s",
            "language" : "en"
        }
    ]
}
{
    "_id" : "103",
    "deleted" : false,
    "alphanumericKey" : "x",
    "sortName" : "xerox",
     "name" : [ 
        {
            "value" : "Xerox",
            "language" : "en"
        }
    ]
}
  

Теперь мне нужно запустить запрос, который сгруппировал бы результаты по буквенно-цифровому значению каждого элемента и отобразил весь объект под этим новым ключом. Также не помешало бы, если бы они были отсортированы в алфавитном порядке, но это приятно иметь… В любом случае в итоге будет выглядеть примерно так:

 {
  "s": [{
      "_id": "101",
      "deleted": false,
      "alphanumericKey": "s",
      "sortName": "something",
      "name": [{
        "value": "Something else with s",
        "language": "en"
      }]
    },
    {
      "_id": "100",
      "deleted": false,
      "alphanumericKey": "s",
      "sortName": "stackoverflow",
      "name": [{
        "value": "Stack Overflow",
        "language": "en"
      }]
    }
  ]
}

{
  x: [{
    "_id": "103",
    "deleted": false,
    "alphanumericKey": "x",
    "sortName": "xerox",
    "name": [{
      "value": "Xerox",
      "language": "en"
    }]
  }]
}
  

Комментарии:

1. Что вы пробовали и какую часть вы не понимаете? Пожалуйста, покажите свою попытку кода в вопросе.

2. db.getCollection(‘service’).aggregate([{$group: {_id:{$substr: [‘$sortName’, 0, 1]}}}]) однако это только группирует через «sortName», и я не могу заставить его отображать остальные поля

3. $push

Ответ №1:

Хитрость заключается в том, чтобы выполнить этап $ group с $$ ROOT. Вот ответ :

 db.collection.aggregate([
  {
    $group: {
      _id: "$alphanumericKey",
      docs: {
        $push: "$$ROOT"
      }
    },

  },
  {
    $sort: {
      _id: 1
    }
  }
])
  

Вернет

 [
  {
    "_id": "s",
    "docs": [
      {
        "_id": "100",
        "alphanumericKey": "s",
        "deleted": false,
        "name": [
          {
            "language": "en",
            "value": "Stack Overflow"
          }
        ],
        "sortName": "stackoverflow"
      },
      {
        "_id": "101",
        "alphanumericKey": "s",
        "deleted": false,
        "name": [
          {
            "language": "en",
            "value": "Something else with s"
          }
        ],
        "sortName": "something"
      }
    ]
  },
  {
    "_id": "x",
    "docs": [
      {
        "_id": "103",
        "alphanumericKey": "x",
        "deleted": false,
        "name": [
          {
            "language": "en",
            "value": "Xerox"
          }
        ],
        "sortName": "xerox"
      }
    ]
  }
]
  

РЕДАКТИРОВАТЬ: Для тех, кто не может использовать $$ ROOT (до версии 2.6), вам необходимо описать весь наш документ на этапе накопления $ group, например :

 db.collection.aggregate([
  {
    $group: {
      _id: "$alphanumericKey",
      docs: {
        $push: {
          "_id": "$_id",
          "alphanumericKey": "$alphanumericKey",
          "deleted": "$deleted",
          "name": "$name",
          "sortName": "$sortName"
        }
      }
    },

  },
  {
    $sort: {
      _id: 1
    }
  }
])
  

Комментарии:

1. Прошу прощения. Я забыл упомянуть: Монго версии 2.4.14. И я вроде как застрял в этой версии. Это приведет к появлению ошибки: «errmsg»: «исключение: имена полей FieldPath могут не начинаться с ‘$'».,