我不确定如何填充下面的示例模式,或者甚至是否可能。引用可以在下面的对象中吗?如果可以的话,你会如何填充它?例如。 .populate('map_data.location');
?
var sampleSchema = new Schema({
name: String,
map_data: [{
location: {type: Schema.Types.ObjectId, ref: 'location'},
count: Number
}]
});
或者我必须有两个单独的数组用于位置和计数如下:
// Locations and counts should act as one object. They should
// Be synced together perfectly. E.g. locations[i] correlates to counts[i]
locations: [{ type: Schema.Types.ObjectId, ref: 'location'}],
counts: [Number]
我觉得第一个解决方案是最好的,但我不完全确定如何让它在Mongoose中运行。
非常感谢您的帮助!
答案 0 :(得分:20)
第一种解决方案是可能的。
Mongoose目前有限制(see this ticket here)填充多层嵌入式文档,但是 非常擅长理解单个文档中的嵌套路径 - 在这种情况下您要遵循的是什么。
示例语法为:
YourSchema.find().populate('map_data.location').exec(...)
其他功能,例如在路径上指定getter / setter,orderBy和where子句等,也接受嵌套路径,如docs中的此示例:
personSchema.virtual('name.full').get(function () {
return this.name.first + ' ' + this.name.last;
});
内部的猫鼬将弦线分开,然后为你排序。
答案 1 :(得分:7)
第一个选项没问题,但如果有人对该查询有问题git archive
- Mongoose返回空数组而不是对象 - 我发现这样可行:
map_data.location
答案 2 :(得分:1)
我认为您将需要此:
如果您的方案是这样的:
var sampleSchema = new Schema({
name: String,
map_data: [{
location: {type: Schema.Types.ObjectId, ref: 'location'},
count: Number
}]
});
您的monggosse查询必须是:
const responseMap=await YourSchema.find()
.populate(
path: 'map_data._id',
model: 'location'
select:['nameLocation','geoPoints','count'],
).exec();
console.log(responseMap);
但是您 count 变量必须位于位置架构中,并且map_data必须仅包含ID位置。
答案 3 :(得分:0)
第一种选择是最好的。 “count”是对象“map_data”的一部分。
答案 4 :(得分:0)
YourSchema.find()
.populate(`{
path: 'map_data',
populate: {path: 'location' }
}`).exec(...)
上面的语句将填充map_data的数组以及每个map_data的位置对象。
希望这有助于某人。