Is it possible to populate objects in map schema type?

↘锁芯ラ 提交于 2021-01-01 00:02:59

问题


I have schema type Map in my mongoose model. In this map, each element has reference to another model. I know that it's possible to populate attributes in array, but how about Map type? Be cause nesting like "map_type_attribute.some_attribute_to_populate" doesn't work. :)

This is my model:

const Mongoose = require('mongoose');

const parameter = Mongoose.Schema({
  definition: {
    type: Mongoose.Schema.Types.ObjectId,
    ref:  'Definition',
  },
  value:      {},
}, {_id: false});

const schema = Mongoose.Schema({
  model:      {
    type: Mongoose.Schema.Types.ObjectId,
    ref:  'Model'
  },
  name:       String,
  objectid:   Number,
  externalId: String,
  properties: Mongoose.Schema.Types.Mixed,
  parameters: {
    type: Map,
    of:   parameter
  }
});

module.exports = Mongoose.model('Element', schema);

This is how i'm trying to populate definition field:

 const request = Element.find(query, projection);
  request.populate('parameters.definition');
  request.exec( (err, docs) => {
...

回答1:


This functionality was added in Mongoose 5.10.3 (September 2020). You simply denote every element in the map with a $*.

In your example this would be:

  const request = Element.find(query, projection);
  request.populate('parameters.$*.definition');
  request.exec( (err, docs) => {



回答2:


I also trying to find answer on this question. It seems that deep-populate work, but only if you put keys from the Map to populate method/function. In your case, if you have data like:

    {
        model: ObjectId("111"),
        name:       "MyName",
        objectid:   111,
        externalId: "ExternalId",
        properties: ...,
        parameters:{
            "parameter1":{
                "definition":ObjectId("333"),
                "value":"value of parameter 1"
        },
            "parameter2":{
                "definition": ObjectId("444"),
                "value": "value of parameter 2"
            }
        }
    }

Then you may find and populate like this:

Element.find({}).populate("parameters.parameter1.definiton")

But it's not a good solution. It would be nice if we have something like regexp inside this populate path.

Currently I've managed only to grab all inner collection, and then manually work with Map to substitude collections. It shouldn't be a huge overhead, since you have only 2 queries to DB. In you case it can be like:

    const elements = Element.find({});
    const parameters = Parameter.find({});
    // go through the elements.parameters and replace it with appropriate value from parameters collection.


来源:https://stackoverflow.com/questions/58611264/is-it-possible-to-populate-objects-in-map-schema-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!