是否可以在映射模式类型中填充对象



我的猫鼬模型中有模式类型Map。在这个映射中,每个元素都引用了另一个模型。我知道可以在数组中填充属性,但Map类型如何?像";映射类型属性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) => {
...

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

在您的示例中,这将是:

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

我也在努力寻找这个问题的答案。似乎深度填充是可行的,但前提是您放入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")

但这不是一个好的解决方案。如果我们在这个填充路径中有类似regexp的东西,那就太好了。

目前,我只获取了所有内部集合,然后手动使用Map to substitude集合。这不应该是一个巨大的开销,因为您对DB只有两个查询。在你的情况下,它可以像:

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

最新更新