Каков наилучший метод для посева приложения Node/MongoDB?

Итак, я новичок в стеке MEAN, и я ударил стену, пытаясь засеять MongoDB. Я использую Mongoose для связи с базой данных, и там есть куча документации, предполагающая, что я должен использовать семплы, используя заполненные файлы JSON.

Что я пробовал:

node-mongo-seed; Довольно прямо вперед, но последовательно выдает ошибки на конце массивов. (Возможно, недостающий модуль bson неисправен?)

{ [Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND' }
js-bson: Failed to load c++ bson extension, using pure JS version
Seeding files from directory /Users/Antwisted/code/wdi/MEAN/seeds
----------------------
Seeding collection locations
err =  [SyntaxError: /Users/Antwisted/code/wdi/MEAN/seeds/locations.json: Unexpected token {]

mongoose-seed; Также довольно прямолинейно, в основном ставит объекты JSON в переменную перед экспортом в базу данных. Перспективные, но... больше ошибок...

Successfully initialized mongoose-seed
[ 'app/models/locationsModel.js' ]
Locations collection cleared
Error creating document [0] of Location model
Error: Location validation failed
Error creating document [1] of Location model
Error: Location validation failed
Error creating document [2] of Location model
Error: Location validation failed...

Итак, мои мысли состояли в том, что это, вероятно, синтаксическая ошибка в структуре JSON, но игра с ней не дала никаких реальных решений (или, может быть, я ее не хватает?). Образец моего JSON:

{
    {
        "header": "Dan Place",
        "rating": 3,
        "address": "125 High Street, New York, 10001",
        "cord1": -73.0812,
        "cord2": 40.8732,
        "attributes": ["Hot drinks", "Food", "Premium wifi"],
        "hours": [
            {
                "days": "Monday - Friday",
                "hours": "7:00am - 7:00pm",
                "closed": false
            },
            {
                "days": "Saturday",
                "hours": "8:00am - 5:00pm",
                "closed": false
            },
            {
                "days": "Sunday",
                "closed": true
            }
        ],
        "reviews": [
            {
                "rating": 4,
                "id": ObjectId(),
                "author": "Philly B.",
                "timestamp": "new Date('Feb 3, 2016')",
                "body": "It was fine, but coffee was a bit dull. Nice atmosphere."
            },
            {
                "rating": 3,
                "id": ObjectId(),
                "author": "Tom B.",
                "timestamp": "new Date('Feb 23, 2016')",
                "body": "I asked for her number. She said no."
            }
        ]
    },
    {
        "header": "Jared Jive",
        "rating": 5,
        "address": "747 Fly Court, New York, 10001",
        "cord1": -73.0812,
        "cord2": 40.8732,
        "attributes": ["Live Music", "Rooftop Bar", "2 Floors"],
        "hours": [
            {
                "days": "Monday - Friday",
                "hours": "7:00am - 7:00pm",
                "closed": false
            },
            {
                "days": "Saturday",
                "hours": "8:00am - 5:00pm",
                "closed": false
            },
            {
                "days": "Sunday",
                "closed": true
            }
        ],
        "reviews": [
            {
                "rating": 5,
                "id": ObjectId(),
                "author": "Jacob G.",
                "timestamp": "new Date('Feb 3, 2016')",
                "body": "Whoa! The music here is wicked good. Definitely going again."
            },
            {
                "rating": 4,
                "id": ObjectId(),
                "author": "Tom B.",
                "timestamp": "new Date('Feb 23, 2016')",
                "body": "I asked to play her a tune. She said no."
            }
        ]
    }
}

Кроме того, я не совсем уверен, как указать субдокументы в JSON (предполагая, что я могу заставить процесс посева работать правильно в первую очередь).

Здесь моя модель:

var mongoose = require('mongoose');

var subHoursSchema = new mongoose.Schema({
    days: {type: String, required: true},
    opening: String,
    closing: String,
    closed: {type: Boolean, required: true}
});

var subReviewsSchema = new mongoose.Schema({
    rating: {type: Number, required: true, min: 0, max: 5},
    author: String,
    timestamp: {type: Date, "default": Date.now},
    body: String
}); 

var locationSchema = new mongoose.Schema({
    name: {type: String, required: true},
    address: String,
    rating: {type: Number, "default": 0, min: 0, max: 5}, 
    attributes: [String],
    coordinates: {type: [Number], index: '2dsphere'},
    openHours: [subHoursSchema],
    reviews: [subReviewsSchema]
});

mongoose.model('Location', locationSchema);

Любое понимание того, как ориентироваться в этих вопросах, было бы весьма полезно. Спасибо!

Ответ 1

Вы можете заполнить MongoDB в CLI, используя mongoimport

Он загрузит файл JSON в указанный экземпляр MongoDB и коллекцию, все, что вам нужно, - это запустить экземпляр mongod перед выполнением.

Вот прохождение использования mongoimport.

Ответ 2

Вы JSON не течет по вашей схеме.

Исправьте свой JSON:

{
    {
        "name": "Dan Place",
        "rating": 3,
        "address": "125 High Street, New York, 10001",
        "coordinates": [-73.0812, 40.8732],
        "attributes": ["Hot drinks", "Food", "Premium wifi"],
        "openHours": [
            {
                "days": "Monday - Friday",
                "opening": "7:00am",
                "closing": "7:00pm",
                "closed": false
            },
            {
                "days": "Saturday",
                "opening": "8:00am",
                "closing": "5:00pm",
                "closed": false
            },
            {
                "days": "Sunday",
                "closed": true
            }
        ],
        "reviews": [
            {
                "rating": 4,
                "author": "Philly B.",
                "timestamp": "new Date('Feb 3, 2016')",
                "body": "It was fine, but coffee was a bit dull. Nice atmosphere."
            },
            {
                "rating": 3,
                "author": "Tom B.",
                "timestamp": "new Date('Feb 23, 2016')",
                "body": "I asked for her number. She said no."
            }
        ]
    },
    {
        "name": "Jared Jive",
        "rating": 5,
        "address": "747 Fly Court, New York, 10001",
        "coordinates": [-73.0812, 40.8732],
        "attributes": ["Live Music", "Rooftop Bar", "2 Floors"],
        "openHours": [
            {
                "days": "Monday - Friday",
                "opening": "7:00am",
                "closing": "7:00pm",
                "closed": false
            },
            {
                "days": "Saturday",
                "opening": "8:00am",
                "closing": "5:00pm",
                "closed": false
            },
            {
                "days": "Sunday",
                "closed": true
            }
        ],
        "reviews": [
            {
                "rating": 5,
                "author": "Jacob G.",
                "timestamp": "new Date('Feb 3, 2016')",
                "body": "Whoa! The music here is wicked good. Definitely going again."
            },
            {
                "rating": 4,
                "author": "Tom B.",
                "timestamp": "new Date('Feb 23, 2016')",
                "body": "I asked to play her a tune. She said no."
            }
        ]
    }
}

Вы можете использовать семя mongoose-data, чтобы написать собственное семя script, которое взаимодействует с вашими моделями mongoose: https://github.com/sharvit/mongoose-data-seed

Ответ 3

Я решил эту проблему в проекте, поместив соответствующие данные в расширенный файл в формате JSON-массива с помощью mongoexport --jsonArray, а затем импортировав их обратно в формат POJO внутри приложения Node с EJSON пакета EJSON. Затем я просто использую Mongoose, чтобы вставить полученный массив JS обратно в базу данных, используя правильную модель коллекции, созданную с помощью Mongoose.

Необходимые файлы данных JSON для заполнения приложения для первого запуска проверяются в хранилище приложения. Вот быстрый пример, который вы сможете адаптировать к вашим целям:

// ...
// 'Items' is the Mongoose collection model.
const itemResult = await Items.find({}).exec();
if(itemResult.length === 0) {
  const itemsSeedDataRaw = fs.readFileSync('${__dirname}/data/items.json', 'utf8');
  const itemsSeedData = EJSON.parse(itemsSeedDataRaw);
  await Items.insertMany(itemsSeedData);
}
// ...

Ответ 4

Привет, тебе лучше использовать Seedgoose. Этот инструмент сеялки поддерживает CLI и интеллектуальные ссылки. Вы можете легко настроить ссылки для разных моделей.