我正在努力在现有的mongo集合上使用.populate。
当我按如下方式声明我的架构时:
var PostSchema = new Schema({
'postOwner': [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
'group': [{ type: mongoose.Schema.Types.ObjectId, ref: 'Group' }],
'title': String,
'body': String
});
使用看起来像这样的数据集
Post: {
__v: 2,
_id: ObjectId("4ffcaa5a3b02181d2900001b"),
body: "Some fabulous text",
group: ObjectId("4fce5e460f49788e06000005"),
title: "This is a title",
owner: ObjectId("4fce5e460f49788e062343205")
}
以下查询很有效,只是它将引用的group和postOwner字段作为单个元素数组返回:
PostSchema
.find( {group: {$in: groups}})
.sort('-createdAt')
.populate('postOwner', 'email firstName lastName')
.populate('group', 'groupName')
.exec(function(err, data) {
if (err) {
console.log('Bad news bears.');
} else {
console.log('Huzzah');
}
});
这会在前端产生一些轻微但可行的麻烦,因为我总是需要在返回的数组中引用元素0。如果我采取从模式中删除数组的逻辑步骤,那么它看起来像这样:
var PostSchema = new Schema({
'postOwner': { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
'group': { type: mongoose.Schema.Types.ObjectId, ref: 'Group' },
'title': String,
'body': String
});
如果数据保持完全相同,则同一查询将为group
或postOwner
返回任何内容(甚至不是ObjectID)。
我可以使用引用数组的第一个元素来使我的引用工作,但它似乎是次优的,我讨厌在我的前端硬编码数组引用。
我错过了“正确”定义我的架构并仍然有我的参考工作吗?
谢谢!
答案 0 :(得分:1)
架构中的JSON格式不正确。最后一个属性不应该后跟逗号。有时这会导致JavaScript中的奇怪行为,尽管它通常会导致整个对象未定义。根据Schema构造函数处理错误的方式,这可能就是您没有得到您期望的行为的原因。
一个权宜之计也可能是不将postOwner
数组发送到客户端,而是postOwner[0]
。它不是最佳的,仍然是硬编码的,但如果你只需要那个元素,那么就可以清理你的前端。