如何在Mongoose中引用子文档?

时间:2018-01-30 10:48:50

标签: node.js

我想使用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"以获取userOneIduserTwoId信息。

1 个答案:

答案 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"
})