在.populate中苦苦挣扎:当引用在数组中时起作用,在没有引用时失败

时间:2014-11-17 02:19:37

标签: mongoose

我正在努力在现有的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
});

如果数据保持完全相同,则同一查询将为grouppostOwner返回任何内容(甚至不是ObjectID)。

我可以使用引用数组的第一个元素来使我的引用工作,但它似乎是次优的,我讨厌在我的前端硬编码数组引用。

我错过了“正确”定义我的架构并仍然有我的参考工作吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

架构中的JSON格式不正确。最后一个属性不应该后跟逗号。有时这会导致JavaScript中的奇怪行为,尽管它通常会导致整个对象未定义。根据Schema构造函数处理错误的方式,这可能就是您没有得到您期望的行为的原因。 一个权宜之计也可能是不将postOwner数组发送到客户端,而是postOwner[0]。它不是最佳的,仍然是硬编码的,但如果你只需要那个元素,那么就可以清理你的前端。