Как получить неопределенные поля из нестрогой схемы Mongoose? - PullRequest
0 голосов
/ 28 марта 2019

Я создал схему Mongoose для коллекции в моей базе данных с именем «instruments». Я сделал это нестрогим, потому что записи, которые будут вставлены туда, могут иметь определенное неизвестное количество пар поле-значение. Имена и значения полей также неизвестны. Теперь он успешно сохраняет документы независимо от того, какие новые поля включены, но у меня есть проблема, когда при попытке получить эти документы и обратиться к динамическим парам поле-значение внутри, используя нотацию JS, я получаю неопределенное значение. Я мог бы успешно получить значение полей, которые я указал в своей схеме, хотя и когда я печатаю весь возвращенный документ, я вижу пары полей-значений, которые я ищу. Это естественное поведение мангуста? Если да, что я могу сделать, чтобы все еще иметь возможность получать поля не в схеме? См. Ниже коды для справки ...

Схема для инструмента


    var mongoose = require('mongoose');

    var Schema = mongoose.Schema;

    var subConfigsSchema = new Schema({
        alias: String,
        value: String,
        position: Number
    }, {_id: false});

    var configsSchema = new Schema({
        bfq: [subConfigsSchema],
        qpa: [subConfigsSchema],
        fmb: [subConfigsSchema],
        cz: [subConfigsSchema]
    }, {_id: false});

    var instrumentSchema = new Schema({
        _id: {
            type: Schema.Types.ObjectId,
            required: true,
            auto: true
        },
        configs: {
            type: configsSchema,
            required: true
        }
    },
    {
        strict: false,
        versionKey: false
    });

    module.exports = mongoose.model('Instrument', instrumentSchema)

Пример запроса


    Instrument.find({_id: '5c9b3747407939296c5af1da'}, function(err, data) {
                if (err) throw err;

                instrument = data[0];

                console.log(instrument);
                console.log(instrument._id);
                console.log(instrument.inpname);
                console.log(Instrument['inpname']);
    });

Вывод прямо сейчас:


    { _id: 5c9b3747407939296c5af1da,
      inpname: 'Nome',
      configs:
       { bfq: [ [Object] ],
         qpa: [ [Object] ],
         fmb: [ [Object] ],
         cz: [ [Object] ] } }
    5c9b3747407939296c5af1da
    undefined
    undefined

Я ожидаю, что оба undefined будут 'Nome'.

1 Ответ

0 голосов
/ 28 марта 2019

После того, как вы смоделировали схему, вы можете ссылаться на нее, используя "ref"

var subConfigsSchema = new Schema({
    alias: String,
    value: String,
    position: Number
}, {_id: false});

var subConfigs = mongoose.model('SubConfig', subConfigsSchema);

var configsSchema = new Schema({
    bfq: [subConfigsSchema],
    qpa: [subConfigsSchema],
    fmb: [subConfigsSchema],
    cz: [subConfigsSchema]
}, {_id: false});

var config = mongoose.model('Config', ConfigsSchema);

var instrumentSchema = new Schema({
    _id: {
        type: Schema.Types.ObjectId, 
        ref: 'SubConfig',
        required: true,
        auto: true
    },
    configs: {
        type: Schema.Types.ObjectId, 
        ref: 'Config',
        required: true
    }
},
{
    strict: false,
    versionKey: false
});

module.exports = mongoose.model('Instrument', instrumentSchema)

Теперь при запросе вам нужно заполнить ссылочную модель. Для этого вам нужно заполнить ссылочную модель.

Instrument.find({}).populate('subconfig').populate('config').exec((err, data)=> {
    if (err) throw err;

    instrument = data[0];

    console.log(instrument);
    console.log(instrument._id);
    console.log(instrument.inpname);
    console.log(Instrument['inpname']);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...