2016-03-15 7 views
8

Quindi, sono nuovo nello stack MEAN e ho colpito un muro cercando di seminare MongoDB. Sto usando Mongoose per comunicare con il database, e c'è un sacco di documentazione che suggerisce che dovrei essere in grado di seminare usando i file JSON popolati.Qual è il metodo migliore per eseguire il seeding di un'applicazione Node/MongoDB?

Quello che ho provato:

node-mongo-seed; Piuttosto semplice, ma con coerenza genera errori sulla fine degli array. (Forse il modulo BSON mancante è la colpa?)

{ [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; Anche piuttosto semplice, in pratica mette gli oggetti JSON in una variabile prima di esportarli nel database. Promettente, ma ... più errori ...

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... 

Quindi, i miei pensieri erano che era probabilmente un errore di sintassi all'interno della struttura JSON, ma giocando con questo non ha prodotto alcun soluzioni reali (o forse sono io mi manca?). Campione del mio JSON:

{ 
    { 
     "header": "Dan's 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's 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." 
      } 
     ] 
    } 
} 

Inoltre, io non sono del tutto sicuro di come specificare documenti secondari all'interno del JSON (supponendo che posso ottenere il processo di semina per funzionare correttamente, in primo luogo).

Ecco il mio modello:

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); 

Tutta la comprensione su come navigare questi problemi sarebbe molto apprezzato. Grazie!

risposta

9

è possibile popolare MongoDB nella CLI utilizzando mongoimport

Sarà caricare un file JSON in un MongoDB grado & Collection specificato, tutto ciò che serve è un esempio mongod per essere in esecuzione prima di eseguire.

Ecco un walkthrough di utilizzo di mongoimport.

+0

Questo sicuramente mi ha aiutato a realizzare quello che stava guardando, almeno in parte. Non sono ancora sicuro (ancora) come modificare il processo per includere i documenti secondari (molto probabilmente 'mongodump'), ma questo è stato un grande passo nella giusta direzione. Grazie! – Antwisted

+0

Cosa intendi quando dici di includere i documenti secondari? – peteb

+0

[Questo post] (http://stackoverflow.com/questions/29354858/create-id-on-subdocuments-on-mongoimport-jsonarray) potrebbe esserti utile in merito ai sottodocumenti con 'mongoimport' – peteb

1

JSON non sta scorrendo lo schema.

riparare il vostro JSON a questo:

{ 
    { 
     "name": "Dan's 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's 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." 
      } 
     ] 
    } 
} 

È possibile utilizzare mangusta-dati-seme di scrivere il proprio script seme che interagire i vostri modelli mangusta con: https://github.com/sharvit/mongoose-data-seed

Problemi correlati