Добавить новый ключ в конец каждого объекта внутри массива - PullRequest
1 голос
/ 21 июня 2020

У меня есть такие данные из mongodb из одной коллекции.

/* 1 */
{
    "_id" : ObjectId("5be94355f220b62c7449dc0f"),
    "districts" : [ 
        {
            "name" : "NORTH AND MIDDLE",
            "code" : 632.0
        }, 
        {
            "name" : "EAST",
            "code" : 603.0
        }, 
        {
            "name" : "SOUTH",
            "code" : 602.0
        }
    ],
    "state" : "ISLANDS"
}

/* 2 */
{
    "_id" : ObjectId("5be94355f220b62c7441dc04"),
    "districts" : [ 
        {
            "name" : "Apple",
            "code" : 512.0
        }, 
        {
            "name" : "Ball",
            "code" : 522.0
        }
    ],
    "state" : "GOLD"
}

/* 3 */
{
    "_id" : ObjectId("5eee07816a011d391a45178"),
    "districts" : [ 
        {
            "name" : "DAM",
            "code" : 478.0
        }, 
        {
            "name" : "DEN",
            "code" : 481.0
        }, 
        {
            "name" : "DOG AND CAT",
            "code" : 461.0
        }
    ],
    "state" : "THE NAGAR AND HAVELI"
}

Мне дали лист Excel, как показано ниже, без другой информации, только 2 столбца

введите описание изображения здесь

Моя работа состоит в том, чтобы добавить «Краткое название района» для всех районов.

Я пробовал метод ниже

var tc = [
    "NORTH AND MIDDLE",
    "EAST",
    "SOUTH",
    "Apple",
    "Ball ",
    "DAM ",
    "DEN ",
    "DOG AND CAT"
]
 

db.dummy.find({"districts.name":{$in:tc}}).forEach(x => {
    x["districts"].forEach( y => {
        if (   
        y.name == "NORTH AND MIDDLE" ){
            y.short_name  = "NAM"
        }
        if (   
            y.name == "EAST" ){
                y.short_name  = "ET"
            }

        if (   
            y.name == "SOUTH" ){
                y.short_name  = "ST"
            }
    })
})

Я получил результат

/* 1 */
{
    "_id" : ObjectId("5be94355f220b62c7449dc0f"),
    "districts" : [ 
        {
            "name" : "NORTH AND MIDDLE",
            "code" : 632.0,
            "short_name" : "NAM"
        }, 
        {
            "name" : "EAST",
            "code" : 603.0,
        "short_name" : "ET"
        }, 
        {
            "name" : "SOUTH",
            "code" : 602.0,
        "short_name" : "ST"
        }
    ],
    "state" : "ISLANDS"
}

/* 2 */
{
    "_id" : ObjectId("5be94355f220b62c7441dc04"),
    "districts" : [ 
        {
            "name" : "Apple",
            "code" : 512.0,
        "short_name" : "Al"
        }, 
        {
            "name" : "Ball",
            "code" : 522.0
        "short_name" : "BA"
        }
    ],
    "state" : "GOLD"
}

/* 3 */
{
    "_id" : ObjectId("5eee07816a011d391a45178"),
    "districts" : [ 
        {
            "name" : "DAM",
            "code" : 478.0,
        "short_name" : "DA"
        }, 
        {
            "name" : "DEN",
            "code" : 481.0,
        "short_name" : "DN"
        }, 
        {
            "name" : "DOG AND CAT",
            "code" : 461.0
        "short_name" : "DAC"
        }
    ],
    "state" : "THE NAGAR AND HAVELI"
}

Это единственный способ ?? например, использование if l oop для всех районов или любые другие методы, такие как использование агрегата mongodb или любые другие методы javascript. Будет полезно, если есть другие методы, поскольку будет проблематично использовать, если l oop, когда есть 730 районов. У меня нет опыта работы с агрегированными фреймворками, поэтому я подумал, что кто-нибудь может знать другой метод.

1 Ответ

1 голос
/ 21 июня 2020

Вы можете написать сопоставление:

const districtNameToShort = {
  'NORTH AND MIDDLE': 'NAM',
  'EAST': 'ET',
  ...
}

Затем в вашем forEach

const districtNameToShort = {
  'NORTH AND MIDDLE': 'NAM',
  'EAST': 'ET'
}
db.dummy.find().forEach(x => {
  db.dummy.update(
    {_id : x._id},
    {$set: {
      districts: x.districts.map(district => {
        district.short_name = districtNameToShort[district.name] || district.name
        return district
      })
    }}
  )
})

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