web-dev-qa-db-fra.com

Quelle est la meilleure méthode pour créer une application Node/MongoDB?

Donc, je suis nouveau dans la pile MEAN, et je me suis heurté à un mur en essayant de semer MongoDB. J'utilise Mongoose pour communiquer avec la base de données, et de nombreux documents suggèrent que je devrais pouvoir utiliser des fichiers JSON remplis.

Ce que j'ai essayé

noeud-mongo-graine; Plutôt simple, mais jette systématiquement des erreurs à la fin des tableaux. (Peut-être que le module bson manquant est en cause?)

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

Mangouste-graine; Également assez simple, place les objets JSON dans une variable avant de les exporter vers la base de données. Prometteur, mais ... plus d'erreurs ...

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

Donc, je pensais que c'était probablement une erreur de syntaxe au sein de la structure JSON, mais jouer avec cela n'a pas apporté de solutions réelles (ou peut-être que je le manque?) Exemple de mon 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."
            }
        ]
    }
}

De plus, je ne suis pas tout à fait sûr de savoir comment spécifier des sous-documents dans le JSON (en supposant que je puisse obtenir le bon déroulement du processus d'amorçage).

Voici mon modèle:

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

Toute idée sur la façon de gérer ces questions serait grandement appréciée. Merci!

11
Antwisted

Vous pouvez peupler MongoDB dans la CLI en utilisant mongoimport

Il chargera un fichier JSON dans une instance et une collection MongoDB spécifiée. Tout ce dont vous avez besoin est qu'une instance mongod soit en cours d'exécution avant son exécution.

Voici une procédure pas à pas d'utilisation de mongoimport.

11
peteb

Vous JSON ne coule pas votre schéma.

Fixez votre JSON à ceci:

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

Vous pouvez utiliser mongoose-data-seed pour écrire votre propre script de départ qui interagit avec vos modèles de mangouste avec: https://github.com/sharvit/mongoose-data-seed

1
Sharvit

J'ai résolu ce problème sur un projet en vidant les données pertinentes dans un fichier au format tableau JSON étendu à l'aide de mongoexport --jsonArray, puis en le réimportant au format POJO dans l'application Node à l'aide du package EJSON. J'utilise ensuite simplement Mongoose pour réinsérer le tableau JS résultant dans la base de données en utilisant le modèle de collection correct que vous avez créé avec Mongoose.

Les fichiers de données JSON nécessaires à l'amorçage de l'application pour une première exécution sont archivés dans le référentiel d'applications . Voici un exemple rapide que vous pourrez peut-être adapter à vos besoins:

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