2016-03-15 16 views
8

Tak więc, jestem nowy w stosie MEAN i uderzyłem w ścianę próbując zasiać MongoDB. Używam Mongoose do komunikowania się z bazą danych, a jest tam garść dokumentacji sugerującej, że powinienem móc wysiewać za pomocą zapełnionych plików JSON.Jaka jest najlepsza metoda wysiewania aplikacji Node/MongoDB?

Co próbowałem:

node-mongo-seed; Całkiem prosto, ale konsekwentnie wyrzuca błędy na końcu tablic. (Być może brakujący moduł bson ponosi winy?)

{ [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; Również całkiem proste, w zasadzie umieszcza obiekty JSON w zmiennej przed eksportowaniem do bazy danych. Obiecujące, ale ... więcej błędów ...

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

Więc, moje myśli były, że to był prawdopodobnie błąd składni w strukturze JSON, ale zabawy z tym nie przyniosła żadnych realnych rozwiązań (albo ja "brakuje tego?). Próbka mojego 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." 
      } 
     ] 
    } 
} 

Dodatkowo, nie jestem do końca pewien, jak określić Dokumenty podrzędne w JSON (zakładając, że mogę dostać proces siew pracować prawidłowo w pierwszej kolejności).

Oto mój model:

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

Każdy wgląd w jaki sposób poruszać tych kwestii byłoby bardzo mile widziane. Dzięki!

Odpowiedz

9

można zapełnić MongoDB w CLI używając mongoimport

Będzie załadować plik JSON do określonego MongoDB Instancji & Collection, co potrzebne jest dla instancji mongod być uruchomiony przed wykonaniem.

Oto walkthrough korzystania z mongoimport.

+0

To na pewno pomogło mi osiągnąć to, co ja szukał, przynajmniej w części. Nie jestem pewien (jeszcze) jak zmodyfikować proces, aby uwzględnić poddokumenty (najprawdopodobniej 'mongodump'), ale był to wielki krok we właściwym kierunku. Dziękuję Ci! – Antwisted

+0

Co masz na myśli, gdy mówisz, że zawierasz dokumenty cząstkowe? – peteb

+0

[Ten wpis] (http://stackoverflow.com/questions/29354858/create-id-on-subdocuments-on-mongoimport-jsonarray) może być pomocny w odniesieniu do subdocs z 'mongoimport' – peteb

1

You JSON nie przepływa przez twój schemat.

Poprawianie JSON do tego:

{ 
    { 
     "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." 
      } 
     ] 
    } 
} 

Można użyć mangusta-data-nasienie napisać własny skrypt nasion, które interakcji modeli Mongoose z: https://github.com/sharvit/mongoose-data-seed

Powiązane problemy