25

我不确定如何填充下面的示例模式,或者是否可能。引用可以在如下对象中吗?如果可以,您将如何填充它?例如.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 中工作。

非常感谢您的帮助!

4

5 回答 5

28

第一种解决方案是可能的。

Mongoose 目前在填充多个级别的嵌入式文档时存在局限性(请参阅此处的票证),但非常擅长理解单个文档中的嵌套路径 - 在这种情况下您所追求的。

示例语法为:

YourSchema.find().populate('map_data.location').exec(...)

其他功能,例如在路径上指定 getter / setter、orderBy 和 where 子句等,也接受嵌套路径,例如文档中的这个示例:

personSchema.virtual('name.full').get(function () {
  return this.name.first + ' ' + this.name.last;
});

在内部,Mongoose 在点处拆分字符串并为您整理所有内容。

于 2013-01-30T00:41:04.590 回答
18

第一个选项没问题,但是如果有人对该查询有疑问map_data.location- Mongoose 返回空数组而不是对象 - 我发现这会起作用:

.populate({
     path: 'map_data.location',
     model: 'Location'
})
于 2016-08-17T20:41:43.743 回答
4
   YourSchema.find()
       .populate({
            path: 'map_data',
            populate: {
                path: 'location' 
            }
    }).exec(...)

上述语句将填充 map_data 数组以及每个 map_data 的位置对象。

希望这可以帮助某人。

于 2018-05-23T22:26:17.433 回答
2

我想你会需要这个:

如果您的架构是这样的:

var sampleSchema = new Schema({
name: String,
map_data: [{
location: {type: Schema.Types.ObjectId, ref: 'location'},
count: Number
}]
});

你 mongosse 查询必须是:

const responseMap=await YourSchema.find()
.populate(
path: 'map_data._id',
model: 'location'
select:['nameLocation','geoPoints','count'],
).exec();
console.log(responseMap);

但是您计数变量必须在位置模式中,并且 map_data 必须仅包含 id 位置。

于 2020-05-15T15:41:42.490 回答
0

第一个选项是最好的。“count”是对象“map_data”的一部分。

于 2013-01-30T00:25:06.110 回答