Как я могу разместить массивы схем внутри схемы? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть две схемы, одна называется position другая называется path. По сути, я хочу, чтобы путь schema содержал массив position схем.

Итак, во-первых, это моя position схема:

const mongoose = require('mongoose');
var Schema = mongoose.Schema;

var positionSchema = new Schema({
    position : {
        x : Number,
        y : Number
    },
    orientation : {
        x : Number
    }
});

var Position = mongoose.model('Position', positionSchema);
module.exports = Position

Простой, просто содержит некоторые числа с плавающей точкой. Тогда это моя path схема, она как отец для position схемы:

const mongoose = require('mongoose');
var Schema = mongoose.Schema;

var Position = require('./position');

var pathSchema = new Schema({
    path : [{type: Schema.ObjectId, ref: 'Position'}]
});

module.exports = mongoose.model("Path", pathSchema);

Итак, теперь я хочу поместить некоторые массивы позиций в схему пути, используя Postman, и код для этого выглядит следующим образом:

router.post("/", (req,res,next)=>{
    const _path = new Path({
        path : req.body.path
    })
    .save()
    .then(docs => {
        const response = {
            status: 201,
            message: "Path has been added succesfully",
            path_ID: docs.path_id,
            path : docs.path
        };
        res.status(201).json(response);
    })
    .catch(err => {
        res.status(500).json({
            message: err
        });
    });
});

Но когда я использую этот пример в Почтальоне:

{"path" : [
    {"position" : { "x": "1111", "y" : "2222"}, "orientation" : { "x":"0"} },
{"position" : { "x": "1111", "y" : "2222"}, "orientation" : { "x":"0"} }
]}

Я получаю ошибку:

 {
    "message": {
        "errors": {
            "path": {
                "message": "Cast to Array failed for value \"[ { position: { x: '1111', y: '2222' }, orientation: { x: '0' } },\n  { position: { x: '1111', y: '2222' }, orientation: { x: '0' } } ]\" at path \"path\"",
                "name": "CastError",
                "stringValue": "\"[ { position: { x: '1111', y: '2222' }, orientation: { x: '0' } },\n  { position: { x: '1111', y: '2222' }, orientation: { x: '0' } } ]\"",
                "kind": "Array",
                "value": [
                    {
                        "position": {
                            "x": "1111",
                            "y": "2222"
                        },
                        "orientation": {
                            "x": "0"
                        }
                    },
                    {
                        "position": {
                            "x": "1111",
                            "y": "2222"
                        },
                        "orientation": {
                            "x": "0"
                        }
                    }
                ],
                "path": "path",
                "reason": {
                    "message": "Cast to ObjectId failed for value \"{ position: { x: '1111', y: '2222' }, orientation: { x: '0' } }\" at path \"path\"",
                    "name": "CastError",
                    "stringValue": "\"{ position: { x: '1111', y: '2222' }, orientation: { x: '0' } }\"",
                    "kind": "ObjectId",
                    "value": {
                        "position": {
                            "x": "1111",
                            "y": "2222"
                        },
                        "orientation": {
                            "x": "0"
                        }
                    },
                    "path": "path"
                }
            }
        },
        "_message": "Path validation failed",
        "message": "Path validation failed: path: Cast to Array failed for value \"[ { position: { x: '1111', y: '2222' }, orientation: { x: '0' } },\n  { position: { x: '1111', y: '2222' }, orientation: { x: '0' } } ]\" at path \"path\"",
        "name": "ValidationError"
    }
}

Так что я предполагаю, что это что-то с моим методом post, так как мой сервер не распознает сообщение должным образом и ожидает чего-то другого.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 05 ноября 2018

path внутри pathSchema - это массив ссылок на Position документы. Это означает, что path должен хранить массив ObjectId, пока вы пытаетесь присвоить ему массив объектов. Сначала вы должны сохранить Position, а затем выдвинуть их значения _id в массив path:

router.post("/", (req,res,next)=>{
    const savePositions = req.body.path.map(position => {          // create promises that save Position documents
        return new Position(position).save();
    });

    Promise.all(savePositions)                                     // run all save promises in parallel
      .then(positions => positions.map(position => position._id))  // get an array of ids of saved documents
      .then(positionsIds => new Path({ path: positionsIds }).save())
      .then(savedPath => {
        // do the job with saved Path
      })
      .catch(err => {
        // handle the error
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...