Заполните базу данных Mon go с mon goose и API - PullRequest
0 голосов
/ 31 марта 2020

Итак, для личного проекта я пытаюсь создать базу данных конференций и их докладов. Для этого я использую сервер сообщества Mon go DB, node.js, mon goose и API Elsevier Scopus. До сих пор я создал свой собственный файл JSON со всей необходимой информацией для каждой конференции, но как только я пытаюсь заполнить каждую конференцию соответствующими документами каждого года выпуска, я не могу правильно извлечь соответствующие данные из файла JSON получено из Scopus.

Схема для моей базы данных следующая:

var edition_papers = new mongoose.Schema({
    title: String,
    author: String,
    abstract: String
});

const papers = mongoose.model('papers', edition_papers);

// will each hold a reference to a multiple document from the papers collection
var conference_edition = new mongoose.Schema({
    edition: Number,
    papers: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'papers'
    }
});

const edition = mongoose.model('editions', conference_edition);


const ConferenceSchema = new Schema({
    acronym : String,
    name : String,
    area : String,
    subarea : String, 
    location : String,  
    year: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'editions'
    }
}); 

Для моей заполненной функции:

function apiCall(conf_name, year) {
    var url = 'https://api.elsevier.com/content/search/scopus?query=CONFNAME(' + conf_name + ')%20AND%20DOCTYPE(cp)%20AND%20SRCTYPE(p)%20AND%20PUBYEAR%20%3D%20' + year + '&apiKey=' + key;
    fetch(url).then(response => response.json()).then(data => {
    console.log(data)
    })
}

function getPapers(year, conf_name) {
    //var json_papers = apiCall(conf_name, year);
    var temp = [];
    for (let i = 0; i < apiCall(conf_name, year).search-results.totalResults; i++) {
        temp[i] = new Papers({
            title: json_papers.entry[i].title,
            author: json_papers.entry[i].creator,
        })
    }

    return temp;
}

function getEdition(conf_name) {
    var years = [2020, 2019, 2018, 2017, 2016, 2015];
    var temp = [];
    for (var i = 0; i < years.length; i++) {
        temp[i] = new Editions({
            editions: years[i],
            papers: getPapers(years[i], conf_name),
        });
    }

    return temp;
}

function createNewConf(conferences) {
    var temp;
    temp = new Conference({
        acronym: conferences.acronym,
        fullname: conferences.fullname,
        area: conferences.area,
        subarea: conferences.subarea,
        location: conferences.location,
        year: getEdition(conferences.acronym),
    });

    return temp;
}

моя проблема в том, что пока я могу чтобы правильно извлечь документ JSON из API, документ выглядит следующим образом, и я не знаю, как использовать «.» на его переменные и эффективно l oop вниз записи этого документа, чтобы получить соответствующие переменные из документов.

{
  'search-results': {
    'opensearch:totalResults': '62',
    'opensearch:startIndex': '0',
    'opensearch:itemsPerPage': '25',
    'opensearch:Query': {
      '@role': 'request',
      '@searchTerms': 'CONFNAME(AAAI) AND DOCTYPE(cp) AND SRCTYPE(p) AND PUBYEAR = 2020',
      '@startPage': '0'
    },
    link: [ [Object], [Object], [Object], [Object] ],
    entry: [
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object], [Object], [Object],
      [Object]
    ]
  }
}

//within each object of the entry array is the following :

"prism:url": "https://api.elsevier.com/content/abstract/scopus_id/85081235453",
        "dc:identifier": "SCOPUS_ID:85081235453",
        "eid": "2-s2.0-85081235453",
        "dc:title": "Structural brain changes with lifetime trauma and re-experiencing symptoms is 5-HTTLPR genotype-dependent",
        "dc:creator": "Ancelin M.L.",
        "prism:publicationName": "European Journal of Psychotraumatology",
        "prism:issn": "20008198",
        "prism:eIssn": "20008066",
        "prism:volume": "11",
        "prism:issueIdentifier": "1",
        "prism:pageRange": null,
        "prism:coverDate": "2020-12-31",
        "prism:coverDisplayDate": "31 December 2020",
        "prism:doi": "10.1080/20008198.2020.1733247",
        "citedby-count": "0",

Я пробовал различные способы, но моя самая большая проблема заключается в том, что «:» не позволяет использовать json_papers.entries. [вставьте здесь переменную] нотация.

У кого-нибудь есть какая-либо соответствующая документация или решение моей проблемы?

Большое спасибо! Матье Боннардо

1 Ответ

0 голосов
/ 31 марта 2020

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

В вашем примере вы пытаетесь получить доступ к точечной записи:

json_papers.entries.[insert variable here ] notation

Чтобы использовать Обозначение в квадратных скобках, вы просто должны сделать это:

json_papers.entries[insert variable here ] notation

В качестве примера, получив ваш json:

const a = {
        "prism:url": "https://api.elsevier.com/content/abstract/scopus_id/85081235453",
        "dc:identifier": "SCOPUS_ID:85081235453",
        "eid": "2-s2.0-85081235453",
        "dc:title": "Structural brain changes with lifetime trauma and re-experiencing symptoms is 5-HTTLPR genotype-dependent",
        "dc:creator": "Ancelin M.L.",
        "prism:publicationName": "European Journal of Psychotraumatology",
        "prism:issn": "20008198",
        "prism:eIssn": "20008066",
        "prism:volume": "11",
        "prism:issueIdentifier": "1",
        "prism:pageRange": null,
        "prism:coverDate": "2020-12-31",
        "prism:coverDisplayDate": "31 December 2020",
        "prism:doi": "10.1080/20008198.2020.1733247",
        "citedby-count": "0"}

Я смог получить доступ к данным json в следующим образом:

a["prism:url"] //"https://api.elsevier.com/content/abstract/scopus_id/85081235453"
...