猫鼬在一个物体内填充?

时间:2013-01-30 00:11:44

标签: node.js mongoose

我不确定如何填充下面的示例模式,或者甚至是否可能。引用可以在下面的对象中吗?如果可以的话,你会如何填充它?例如。 .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中运行。

非常感谢您的帮助!

5 个答案:

答案 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的位置对象。

希望这有助于某人。