Как изменить поле из вложенного документа родительского поля в Mongoose - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь экспортировать данные Mongo в XLSX, который требует, чтобы все данные были в родительской карте, но в настоящее время у меня есть данные в этом формате:

[
    {
        "_id": "eatete",
        "competition": {
            "_id": "eatete"
            "name": "Some competition name"
        },
        "members": [
            {
                "_id": "eatete",
                "name": "Saad"
            },
            {
                "_id": "eatete",
                "name": "Saad2"
            }
        ],
        "leader": {
            "name": "Saad",
            "institute": {
                "_id": "eatete",
                "name": "Some institute name"
            }
        },
    }
]

В идеале данные должны быть:

[
    {
        "_id": "eatete",
        "competition": "Some competition name"
        "member0name": "Saad",
        "member1name": "Saad2",
        "leadername": "Saad",
        "institute": "Some institute name"
    }
]

Итак, в общем, я хочу, чтобы ссылки на поля вложенных документов были такими, как если бы они были частью родительского документа, например, соревнования = CompetitionSname.

Можете ли вы помочь мне, как можноЯ делаю это, используя Mongoose.

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Еще немного aggregation trick

db.collection.aggregate([
  { "$unwind": { "path": "$members", "includeArrayIndex": "i" }},
  { "$group": {
    "_id": "$_id",
    "competition": { "$first": "$competition.name" },
    "leadername": { "$first": "$leader.name" },
    "institute": { "$first": "$leader.institute.name" },
    "data": {
      "$push": {
        "k": { "$concat": ["members", { "$toLower": "$i" }, "name"] },
        "v": "$members.name"
      }
    }
  }},
  { "$replaceRoot": {
    "newRoot": {
      "$mergeObjects": ["$$ROOT", { "$arrayToObject": "$data" }]
    }
  }},
  { "$project": { "data": 0 }}
])
0 голосов
/ 14 февраля 2019

Вы можете попробовать агрегацию ниже на вашем Model:

let resultt = await Model.aggregate([
    {
        $project: {
            _id: 1,
            competition: "$competition.name",
            leadername: "$leader.name",
            institute: "$leader.institute.name",
            members: {
                $map: { 
                    input: { $range: [ 0, { $size: "$members" } ] },
                    in: {
                        k: { $concat: [ "member", { $toString: "$$this" }, "name" ] },
                        v: {
                            $let: {
                                vars: { current: { $arrayElemAt: [ "$members", "$$this" ] } },
                                in: "$$current.name"
                            }
                        }
                    } 
                }
            }
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $mergeObjects: [ "$$ROOT", { $arrayToObject: "$members" } ]
            }
        }
    },
    {
        $project: {
            members: 0
        }
    }
])

Поскольку вам необходимо динамически оценивать ваши ключи на основе индексов, вы можете использовать $ map с $диапазон для отображения списка индексов в ключах нового объекта.Затем вы можете использовать $ arrayToObject , чтобы получить объект из этих ключей, и $ mergeObjects с $ replaceRoot , чтобы сгладить структуру этого объекта.

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