与 .populate 作斗争:当引用在数组中时有效,当不工作时失败



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

以下查询运行良好,不同之处在于它将引用的组和 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
});

在数据保持完全相同的情况下,相同的查询根本不返回任何内容(甚至不返回 ObjectID)grouppostOwner

我可以接受引用数组的第一个元素以使我的引用工作,但它似乎不是最佳的,我讨厌在我的前端硬编码数组引用。

为了"正确"定义我的架构并且仍然让我的引用工作,我缺少什么?

谢谢!

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

相关内容

最新更新