Mongodb сгладить комплексные данные для экспорта - PullRequest
0 голосов
/ 28 июня 2019

Я хочу выровнять свою модель данных для экспорта в формате CSV. Я думаю, что я могу получить с агрегацией, но я не знаю, как,

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

У меня есть модель, которая выглядит следующим образом

{
    "_id" : ObjectId,
    "email" : string,
    "dates" : {
        "registered" : ISODate,
        "last_activity" : ISODate
    },
    "autos" : [ 
        {
            "_id" : ObjectId,
            "make" : string,
            "model" : string,
            "color" : string
        }
    ],
    "boats": [
        {
            "_id" : ObjectId,
            "manu" : string,
            "model" : string,
            "motor" : string
        }
    ]
}

Это все, что я получил с помощью конвейера агрегации.

db.users.aggregate( [ 
    { $unwind: "$autos" },
    {
      $project: {
          _id: 1,
          email: 1,
          'dates.registered': 1,
          'autos.make': 1,
          'autos.model': 1
      }
   }
 ] )

Мое возвращение выглядит так

{
    "_id" : ObjectId(),
    "dates" : {
        "registered" : ISODate()
    },
    "email" : "...",
    "autos" : {
        "make" : "...",        
        "model" : "..."
    }
}

Но я хочу, чтобы мое возвращение выглядело так:

{
    "_id" : ObjectId(),
    "registered" : ISODate(),
    "email" : "..."
    "auto_make" : "...",        
    "auto_model" : "..."
}

и как продолжение - можно ли раскрутить второй массив "лодок" в том же запросе ????

Так что мои результаты будут выглядеть так

{
    "_id" : ObjectId(),
    "registered" : ISODate(),
    "email" : "...",       
    "auto_model" : "...",
    "auto_color" : "...",      
    "boat_model" : "...",    
    "boat_motor" : "...",
}

1 Ответ

1 голос
/ 28 июня 2019

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

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

db.users.aggregate( [ 
    { $unwind: "$autos" }, //this line can be removed if you want the result to be an array instead of a string
    {
      $project: {
          _id: 1,
          email: 1,
          registered: '$dates.registered',
          auto_make: '$autos.make',
          auto_model: '$autos.model'
      }
   }
 ] )
output: (with unwind) 
{
    "_id" : ObjectId("5d15aa446810eb770fd47f7c"),
    "email" : "string",
    "registered" : ISODate("2019-06-28T05:48:52.652Z"),
    "auto_make" : "string",
    "auto_model" : "string"
},
{
    "_id" : ObjectId("5d15aa446810eb770fd47f7c"),
    "email" : "string",
    "registered" : ISODate("2019-06-28T05:48:52.652Z"),
    "auto_make" : "string",
    "auto_model" : "string"
},
{
    "_id" : ObjectId("5d15aa446810eb770fd47f7c"),
    "email" : "string",
    "registered" : ISODate("2019-06-28T05:48:52.652Z"),
    "auto_make" : "string",
    "auto_model" : "string"
}
output: (without unwind))
{
    "_id" : ObjectId("5d15aa446810eb770fd47f7c"),
    "email" : "string",
    "registered" : ISODate("2019-06-28T05:48:52.652Z"),
    "auto_make" : [ 
        "string", 
        "string", 
        "string"
    ],
    "auto_model" : [ 
        "string", 
        "string", 
        "string"
    ]
}

Обновлено: раскручивание обоих

Этот пример дает 6 выходных документов для 1 пользователя с 2 авто, 3 лодки

db.temp.aggregate( [ 
    { $unwind: "$autos" }, 
    { $unwind: "$boats" }, 
    {
      $project: {
          _id: 1,
          email: 1,
          registered: '$dates.registered',
          auto_make: '$autos.make',
          auto_model: '$autos.model',
          boat_model: '$boats.model',
          boat_motor: '$boats.motor'
      }
   }
 ] )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...