Как импортировать большой CSV-файл (15M Data) с Mon goose, в котором есть вложенные документы, используя NodeJS и Javascript? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть файл csv с именем «propertyTableMongoData.csv» в той же папке, что и моя mongoSchema. js, и я пытаюсь импортировать эти 15 миллионов документов (строк) в коллекцию «обзоров», но это не работает.

Моя схема содержит вложенные данные, поэтому я использовал тип Mon goose Maps . В нижней части я использую следующее предложение StackOverFlow , и оно не работает.

Интересно, есть ли какая-либо синтаксическая ошибка или что-то подобное.

Вот что мой "propertyTableMongoData.csv" выглядит в VSCode:

enter image description here

Вот мой файл mongoSchema. js:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/reviews', {useNewUrlParser: true, useUnifiedTopology: true});

const Schema = mongoose.Schema;

const LineInputStream = require("line-input-stream")
const fs = require("fs")
const async = require("async")


const propertySchema = new Schema({
    property_id: {type: Number, required: true},
    property_name: {type: String, required: true},
    property_address: {type: String, required: true},
    property_maximum_guest: {type: Number, required: true},
    property_room_type: {type: String, required: true},
    review: {
        review_id: {
            type: Map,
            of: Number
        },
        user_id: {
            type: Map,
            of: Number
        },
        user_acct: {
            type: Map,
            of: String
        },
        user_photo_url: {
            type: Map,
            of: String
        },
        user_joined_year: {
            type: Map,
            of: Number
        },
        review_content: {
            type: Map,
            of: String
        },
        created_at: {
            type: Map,
            of: String
        },
        communication_rating: {
            type: Map,
            of: Number
        },
        accuracy_rating: {
            type: Map,
            of: Number
        },
        cleanliness_rating: {
            type: Map,
            of: Number
        },
        checkin_rating: {
            type: Map,
            of: Number
        },
        location_rating: {
            type: Map,
            of: Number
        },
        value_rating: {
            type: Map,
            of: Number
        }
    },
});

const PropertyModel = mongoose.model('property', propertySchema);

const stream = LineInputStream(fs.createReadStream("propertyTableMongoData.csv",{ flags: "r" }));

stream.setDelimiter("\n");

mongoose.connection.on("open", function(err, conn) {
    const bulk = PropertyModel.collection.initializeOrderedBullOp();
    const counter = 0;

    stream.on("error", function(err) {
        console.log(err);
    });

    stream.on("line", function(line) {
        async.series(
            [
                function(callback) {
                    const row = line.split(",");
                    const obj = {};
                    bulk.insert(obj);

                    counter++;

                    if (counter % 1000 == 0) {
                        stream.pause();
                        bulk.execute(function(err, result) {
                            if (err) throw err;
                            bulk = PropertyModel.collection.initializeOrderedBullOp();
                            callback();
                        });
                    } else {
                        callback();
                    }
                }
            ],
            function (err) {

            }
        );
    });

    stream.on("end", function() {
        if (counter % 1000 != 0)
            bulk.execute(function(err, result) {
                if (err) throw err;
            });
    });
});


// Reference: https://stackoverflow.com/questions/25054958/save-a-very-big-csv-to-mongodb-using-mongoose

Это следующее сообщение об ошибке, которое я получил в Ubuntu при запуске команды "node mongoSchema. js":

enter image description here

1 Ответ

0 голосов
/ 26 февраля 2020

Я понял, как это сделать, за исключением того, что это не через CSV-файл

mongoSchema. js

const mongoose = require('mongoose');
const faker = require('faker')
mongoose.connect('mongodb://localhost/reviews', {useNewUrlParser: true, useUnifiedTopology: true});

const Schema = mongoose.Schema;

const propertySchema = new Schema({
    property_id: {type: Number, required: true, unique: true},
    property_name: {type: String, required: true},
    property_address: {type: String, required: true},
    property_maximum_guest: {type: Number, required: true},
    property_room_type: {type: String, required: true},
    review: [{
        review_id: {type: Number, required: true, unique: true},
        user: {
            user_id: {type: Number, required: true},
            user_acct: String,
            user_photo_url: String,
            joined_year: {type: Number, required: true}
        },
        review_content: String,
        created_at: {type: Date, required: true},
        communication_rating: {type: Number, required: true},
        accuracy_rating: {type: Number, required: true},
        cleanliness_rating: {type: Number, required: true},
        checkin_rating: {type: Number, required: true},
        location_rating: {type: Number, required: true},
        value_rating: {type: Number, required: true}
    }]
});

const PropertyModel = mongoose.model('property', propertySchema);

module.exports = { PropertyModel };

mongoSeed. js

const mongoose = require('mongoose');
const faker = require('faker');
const PropertyModel = require('./newMongoSchema.js');
require('events').EventEmitter.prototype._maxListeners = 10000;

async function seedMongo(outer, inner) {
    var reviewCounter = 1;
    var reviewArr = [];
    var createUsers = function() {
        for (var k=0; k<faker.random.number({ 'min': 0, 'max': 10 }); k++) {
            const range = faker.random.number({
                'min': 1,
                'max': 1000
            });
            reviewArr.push({
                review_id: reviewCounter,
                user: {
                    user_id: faker.random.number({
                        'min': 1,
                        'max': 50000000
                    }),
                    user_acct: faker.lorem.word(),
                    user_photo_url: `https://sdcuserphotos.s3.us-west-1.amazonaws.com/${range}.jpg`,
                    joined_year: faker.date.between('2018-01-01', '2020-12-31')
                },
                review_content: faker.lorem.paragraph(),
                created_at: faker.date.past(5),
                communication_rating: faker.random.number({
                    'min': 1,
                    'max': 5
                }),
                accuracy_rating: faker.random.number({
                    'min': 1,
                    'max': 5
                }),
                cleanliness_rating: faker.random.number({
                    'min': 1,
                    'max': 5
                }),
                checkin_rating: faker.random.number({
                    'min': 1,
                    'max': 5
                }),
                location_rating: faker.random.number({
                    'min': 1,
                    'max': 5
                }), 
                value_rating: faker.random.number({
                    'min': 1,
                    'max': 5
                })
            });
            reviewCounter += 1;
        }
    }
    let counter = 1;
    for (var i=0; i<outer; i++) {
        let listingsArr = [];
        for (var j=0; j<inner; j++) {
            createUsers();
            let obj = {
                property_id: counter,
                property_name: faker.lorem.word(),
                property_address: faker.address.streetAddress(),
                property_maximum_guest: faker.random.number({
                    'min': 1,
                    'max': 8
                }),
                property_room_type: faker.lorem.word(),
                review: reviewArr
            }
            listingsArr.push(obj);
            counter += 1;
            reviewArr = [];
            if (counter % 10000 === 0) {
                console.log('progress', counter)
            }
        }
        await PropertyModel.PropertyModel.insertMany(listingsArr);
    }
}

// seedMongo(10, 10);
seedMongo(50000, 200);
console.log('...done');
console.time('seed time');
console.timeEnd('seed time');

// Reference: https://medium.com/glitter-guys/hack-reactor-sdc-part-ii-fake-the-millions-26d372e67f80
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...