如何从非严格的Mongoose模式中获取未指定的字段?

时间:2019-03-28 03:33:55

标签: node.js mongodb express mongoose

我在名为“ instruments”的数据库中为集合创建了Mongoose模式。我将其设置为非严格,因为要在其中插入的记录可能具有一定数量的未知的字段-值对。字段名称和值也是未知的。现在,无论包括什么新字段,它都能成功保存文档,但是当我尝试检索这些文档并使用JS点表示法引用内部的动态字段-值对时,却遇到了一个不确定的问题。我可以成功获取在模式中指定的字段的值,但是当我打印返回的整个文档时,我看到了要查找的字段-值对。这是自然的猫鼬行为吗?如果是,我该怎么做才能仍然获得不在架构中的字段?请参阅以下代码以供参考...

仪器架构

    Name    Clust1     Clust2     Clust3
    BB    0.7694628  0.03241972 0.02935754
    CC    0.1099033  0.52170750 0.28385905

示例查询

import java.util.ArrayList;
import java.util.List;
public class MyClass {
public static void allButLast(List<String> list)
{
   List<String> set = new ArrayList<String>();
   for (int k : list)
   {
      set.remove(0, -2);
   }
   return set;
}

现在的输出是:


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

我希望两个未定义的都是“ Nome”。

1 个答案:

答案 0 :(得分:0)

对模式进行建模后,可以使用“ 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']);
});