Mongoose - 在一个ObjectId数组上使用Populate

43

我有一个类似于以下结构的模式:

var conversationSchema = new Schema({
    created: { type: Date, default: Date.now },
    updated: { type: Date, default: Date.now },
    recipients: { type: [Schema.ObjectId], ref: 'User' },
    messages: [ conversationMessageSchema ]
});

我的收件人集合是一个包含指向用户模式/集合的对象ID的集合。

我需要在查询时填充这些内容,所以我正在尝试这样做:

Conversation.findOne({ _id: myConversationId})
.populate('user')
.run(function(err, conversation){
    //do stuff
});

但是显然"user"没有被填充...

我能做到这一点的方法吗?

2个回答

124

对于任何其他看到这个问题的人.. OP 的代码在模式定义中有一个错误.. 应该是:

var conversationSchema = new Schema({
    created: { type: Date, default: Date.now },
    updated: { type: Date, default: Date.now },
    recipients: [{ type: Schema.ObjectId, ref: 'User' }],
    messages: [ conversationMessageSchema ]
});
mongoose.model('Conversation', conversationSchema);

5
您刚才救了我一大堆麻烦。脱帽致敬 - Khalid Bajwa
1
好方法!但是你如何创建一个唯一对象ID的数组?没有重复的? - Gura
4
{ type: Schema.ObjectId, ref: 'User', unique: true }:用户的模式对象ID,唯一。 - Muli Yulzary
@MuliYulzary,根据这里的文档,我认为那不是正确的。他们声称它不是验证器,而只有在创建MongoDB索引时才有帮助。 - Dev Yego
1
无法工作。返回空数组。我的mongoose版本为v5.11.14。 - Sushil

44

使用模式路径的名称而不是集合名称:

Conversation.findOne({ _id: myConversationId})
.populate('recipients') // <==
.exec(function(err, conversation){
    //do stuff
});

我的Mongoose v5.11.14 - Sushil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接