设置
比方说,我们有模式Foo
和Bar
。 Foo
有一个字段bar
。该字段可以包含引用文档Bar
的ObjectId,也可以包含其他非ObjectId的任意对象。仅当字段包含ObjectId时,才有可能让猫鼬填充混合字段?
const fooSchema = new mongoose.Schema({
bar: {
type: mongoose.Schema.Types.Mixed,
ref: 'Bar'
}
});
const Foo = <any>mongoose.model<any>('Foo', fooSchema);
const barSchema = new mongoose.Schema({
name: String
});
const Bar = <any>mongoose.model<any>('Bar', barSchema);
问题
现在假设我们有一大堆的Foo
文件。
我想能够使用猫鼬的populate
在bar
场与实际Bar
文档本身自动替换为Bar
文件引用。我还想保留所有其他未引用Bar
文档的对象。
通常情况下,我会用这样的事情让所有的Foo
文档,然后填充bar
领域:
Foo.find().populate('bar')
然而,这种方法当它遇到的bar
字段是对象将抛出一个异常而不是ObjectIds,而不是让它们保持原样。
UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): CastError: Cast to ObjectId failed for value "Some arbitrary object" at path "_id" for model "Bar"
尝试寻求解决
我已经使用上populate
的match
选项检查,通过要求在Bar
一个字段存在:
Foo.find().populate({
path: 'bar',
match: {
name: {
$exists: true
}
}
}
不幸的是,该错误是一样的。
问题
所以我的问题是那么,有没有什么办法让猫鼬只有populate
一个字段如果该字段包含的ObjectId和息事宁人,否则?
你可以在find上添加一个post hook吗?,那么你可以检查prop是否是一个ObjectId或其他东西,如果它的ObjectId,你搜索并追加到对象,如果没有,你可以调用next()而不做任何改变。 –
@SebastiánEspinosa听起来好像可以工作。然而,不利的一面是,即使我没有调用'populate()',每次我执行'Foo.find()'时,它都会自动填充。所以我不能在不需要的时候“退出”填充。如果我理解正确? – Zsw
您添加一个静态方法而不是挂钩 –