Как агрегировать, чтобы иметь _id в качестве свойства объекта - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть следующая коллекция:

{
  _id: 1,
  type: "Feature",
  properties: {
    name: "Name 1",
    <other properties here>
  }
},
{
  _id: 2,
  type: "Feature",
  properties: {
    name: "Name 2",
    <other properties here>
  }
}

Как мне написать агрегатный запрос MongoDB, чтобы вернуть следующее?

{
  data: {
    type: "Feature",
    properties: {
      _id: 1,
      name: "Name 1",
      <other properties here>
    }
  }
},
{
  data: {
    type: "Feature",
    properties: {
      _id: 2,
      name: "Name 2",
      <other properties here>
    }
  }
}

Итак, _id должен стать атрибутом properties и каждый документ должен быть возвращен как объект data.

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

Достаточно простого манипулирования структурой:

db.collection.aggregate([
    {
       $project: {
           data: {
             type: "$type",
             properties: { 
                $mergeObjects: [
                 {_id: "$_id"},
                 "$properties"
                ]
             }
           }
       }
    }
])
1 голос
/ 23 апреля 2020

попробуйте это

1 - Если вам нужно, чтобы внутри свойств был только _id, а не в объекте данных

db.collection.aggregate([
  {
    $group: {
      _id: "$_id",
      type: {
        $first: "$type"
      },
      properties: {
        $first: {
          _id: "$_id",
          name: "$properties.name"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      data: "$$ROOT"
    }
  },
  {
    $project: {
      "data._id": 0
    }
  }
])

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

2- Если важно только получить _id внутри объекта свойств, и вам все равно, находится он в данных или нет

, вы можете использовать это

db.collection.aggregate([
  {
    $group: {
      _id: "$_id",
      type: {
        $first: "$type"
      },
      properties: {
        $first: {
          _id: "$_id",
          name: "$properties.name"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      data: "$$ROOT"
    }
  }
])

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

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

Я не смог использовать ваш набор данных, так как он не был отформатирован в RF C 8259. Однако при условии, что ваш набор данных правильно отформатирован, как показано ниже. Выданная команда будет близка к концу при условии совпадения полей

    {
   "data":{
      "Feature":{
         "properties":{
            "_id1":[
               "object_of_data1",
               "object_of_data2",
               "object_of_data3"
            ],
            "_id2":[
               "object_of_data1",
               "object_of_data2",
               "object_of_data3"
            ],
            "_id3":[
               "object_of_data1",
               "object_of_data2",
               "object_of_data3"
            ]
         }
      }
   }
}

Затем я буду использовать команду:

 db.orders.aggregate([
       { $match: { properties: "_id1" } },
       { $group: { _id1: "object_of_data1", "object_of_data2" 
    "object_of_data3" } } }
    ])

Для дальнейшего чтения см. Сравнение команд агрегирования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...