3

我的猫鼬模型中有模式类型 Map 。在这张地图中,每个元素都引用了另一个模型。我知道可以在数组中填充属性,但是 Map 类型呢?因为像“map_type_attribute.some_attribute_to_populate”这样的嵌套不起作用。:)

这是我的模型:

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

这就是我试图填充定义字段的方式:

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

2 回答 2

0

此功能是在 Mongoose 5.10.3(2020 年 9 月)中添加的。您只需用 . 来表示地图中的每个元素$*

在您的示例中,这将是:

  const request = Element.find(query, projection);
  request.populate('parameters.$*.definition');
  request.exec( (err, docs) => {
于 2020-11-30T22:47:52.850 回答
-1

我也试图找到这个问题的答案。似乎深度填充有效,但前提是您将 Map 中的键用于填充方法/函数。就您而言,如果您有以下数据:

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

然后你可能会像这样找到并填充:

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

但这不是一个好的解决方案。如果我们在这个填充路径中有类似正则表达式的东西会很好。

目前我只设法抓取所有内部集合,然后手动使用 Map 来替代集合。这不应该是一个巨大的开销,因为您只有 2 个对 DB 的查询。在你的情况下,它可能是这样的:

    const elements = Element.find({});
    const parameters = Parameter.find({});
    // go through the elements.parameters and replace it with appropriate value from parameters collection.
于 2020-02-18T18:31:58.517 回答