【发布时间】:2018-09-11 16:01:36
【问题描述】:
TL;DR 您如何引用(并因此填充)同一集合中的子文档?
我一直在尝试在我的 Mongoose 架构中填充对子文档的引用。我有一个包含位置和联系人数组的主架构(MainSchema)。这些位置引用了这些联系人。
在我的位置数组中,我通过联系人的 _id 引用这些联系人。见下文。
import mongoose from 'mongoose';
const LocationSchema = new mongoose.Schema({
city: {type: String},
contact: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Contact' //alternative tried: refPath: 'contacts'
}
});
const Location = mongoose.model('Location', LocationSchema);
const ContactSchema = new mongoose.Schema({
firstName: {type: String},
lastName: {type: String}
});
const Contact = mongoose.model('Contact', ContactSchema );
const MainSchema = new mongoose.Schema({
name: {type: String},
locations: [LocationSchema],
contacts: [ContactSchema]
});
export.default mongoose.model('Main', 'MainSchema');
现在,当我想填充位置的联系人时,我得到 null 或者只是返回的普通 _id 字符串。下面是我的填充代码。我已经尝试了所有我能找到的组合,包括让嵌套文档成为自己的模型并尝试不同的方式来引用它们。
MainSchema.statics = {
get(slug) {
return this.findOne({name})
.populate('locations.contact')
.exec()
.then((company) => {
if (company) {
return company;
}
const err = 'generic error message';
return Promise.reject(err);
});
}
};
我也尝试了新的方法,但无济于事:
populate({
path: 'locations',
populate: {
path: 'contacts',
model: 'Contact'
}
});
我一定在这里遗漏了什么。但是什么?
编辑了问题以按要求显示完整的查询语句
【问题讨论】:
-
你能把整个查询写下来吗?不只是最后一个 sn-p 中的
populate?所以我可以更好地理解你想要达到的目标 -
.populate({path : 'locations', populate : {path: 'contacts'}})应该可以工作,同样在你的第一个 sn-p 示例中,我没有看到其他两个模型的export函数,你有定义吗? -
您的数组
locations: [LocationSchema]和contacts: [ContactSchema]是否包含引用_id?从其他模式 -
@Sabbin 感谢 cmets。我已经添加了模型语句。我的位置数组包含对contact._id 的引用。当我尝试您的建议时,查询按原样返回此引用,因此尚未填充。
-
在您的
MainSchema中有locations: [LocationSchema],是否有来自LocationSchema的参考ID?在数据库中,您应该有一个带有MongoDBobjectId 的数组
标签: javascript node.js mongodb mongoose