webentwicklung-frage-antwort-db.com.de

Was ist die beste Methode zum Seeding einer Node/MongoDB-Anwendung?

Also, ich bin neu im MEAN-Stack und habe versucht, MongoDB zu säen. Ich verwende Mongoose, um mit der Datenbank zu kommunizieren, und es gibt eine Reihe von Dokumentationen, die nahe legen, dass ich mit gefüllten JSON-Dateien Seeds ausführen kann.

Was ich probiert habe:

Knoten-Mongo-Samen; Ziemlich einfach, wirft aber ständig Fehler am Ende von Arrays. (Vielleicht ist das fehlende bson-Modul schuld?)

{ [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 {]

Mungo-Samen; Auch recht einfach: Die JSON-Objekte werden vor dem Export in die Datenbank in eine Variable geschrieben. Vielversprechend, aber ... weitere Fehler ...

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

Meine Gedanken waren also, dass es wahrscheinlich ein Syntaxfehler in der JSON-Struktur war, aber das Herumspielen mit dem hat zu keinen wirklichen Lösungen geführt (oder fehlt mir das vielleicht?). Beispiel meiner 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."
            }
        ]
    }
}

Darüber hinaus bin ich nicht ganz sicher, wie man Filialdokumente in der JSON-Klasse angibt (vorausgesetzt, ich kann den Seeding-Prozess überhaupt erst richtig funktionieren lassen).

Hier ist mein Modell:

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

Jede Einsicht in die Navigation in diesen Fragen wäre sehr dankbar. Vielen Dank!

11
Antwisted

Sie können MongoDB in der CLI mit mongoimport befüllen.

Es lädt eine JSON-Datei in eine angegebene MongoDB-Instanz und -Kollektion. Sie müssen lediglich eine mongod-Instanz ausführen, bevor sie ausgeführt wird.

Hier ist ein walkthrough der Verwendung von mongoimport.

11
peteb

Ihr JSON fließt nicht in Ihr Schema.

Fixiere dein JSON darauf:

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

Sie können mongoose-data-seed verwenden, um Ihr eigenes Seed-Skript zu schreiben, das Ihre Mungo-Modelle mit folgenden Elementen interagiert: https://github.com/sharvit/mongoose-data-seed

1
Sharvit

Ich habe dieses Problem in einem Projekt gelöst, indem ich die relevanten Daten mithilfe von mongoexport --jsonArray in eine erweiterte JSON-Array-formatierte Datei ablegte und diese dann mithilfe des Pakets EJSON wieder in das POJO-Format in der Anwendung Node importierte. Ich verwende dann einfach Mongoose, um das resultierende JS-Array mit dem richtigen Sammlungsmodell, das Sie mit Mongoose erstellt haben, wieder in die Datenbank einzufügen.

Die erforderlichen JSON-Datendateien, um die Anwendung für einen ersten Durchlauf zu starten, werden in das Anwendungs-Repository eingecheckt. Hier ein kurzes Beispiel, das Sie möglicherweise an Ihre Zwecke anpassen können:

// ...
// '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);
}
// ...
0
ajxs