我想使用Mongoose
获取Subdocument这是我的对话架构:
const Conversations = new mongoose.Schema({
userOneId: {
type: Schema.Types.ObjectId,
ref: 'User'
},
userTwoId: {
type: Schema.Types.ObjectId,
ref: 'User'
}
这是我的用户模型架构:
....
conversations: [{ type: Schema.Types.ObjectId, ref: 'Conversations' }]
});
插入后我得到了这个:
{
"_id": {
"$oid": "5a6fa114ffc53523705d52af"
},
"created_at": {
"$date": "2018-01-29T22:32:52.930Z"
},
"messages": [],
"__v": 0
}
我插入了这个:
"conversations": [
{
"$oid": "5a6fa14a5562572a541bacae"
},
我已经说过了:
Object.assign(conversation, {userOneId: user._id});
Object.assign(conversation, {userTwoId: friend._id});
我想访问"$oid": "5a6fa114ffc53523705d52af"
以获取userOneId
和userTwoId
信息。
答案 0 :(得分:1)
您需要使用populate。
基本上,在用户对象的“conversations”属性中,您只有ObjectId的对话,而不是整个猫鼬对象。当您为用户/用户查询数据库时,您必须告诉mongoose您希望它将ObjectIds替换为整个对象。
//lets say you have a variable, userId, inside of which you have the id
//of a user, and now you're querying the database for that user
User.findById(userId).populate("conversations")
.exec(function(err, foundUser){
if(err){
console.log(err):
} else {
console.log(foundUser.conversations);
}
});
如果您要使用实际用户_id运行上面的代码,那么(除非您收到错误)您将在控制台中打印而不是会话mongoose ID数组,这是一组会话mongoose对象。整件事。
如果您只希望对话具有两个属性userOneId和userTwoId,则将populate与select结合使用。而不是
.populate("conversations")
使用
.populate({
path: "conversations",
select: "userOneId userTwoId"
})