Mongoose 嵌套填充虚拟返回 null

时间:2020-12-28 07:12:46

标签: mongodb express mongoose virtual

为什么嵌套填充中的 virtual 返回 null?

我有一个 Post 架构和一个 User 架构,如下所示:

发布架构

const PostSchema = new mongoose.Schema({
    _author_id: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
    privacy: {
        type: String,
        default: 'public'
    },
    ...
}, { timestamps: true, toJSON: { virtuals: true }, toObject: { getters: true, virtuals: true } });

PostSchema.virtual('author', {
    ref: 'User',
    localField: '_author_id',
    foreignField: '_id',
    justOne: true
});

module.exports = mongoose.model('Post', PostSchema);

用户架构

const UserSchema = new mongoose.Schema({
    email: {
        type: String,
        required: true,
        minlength: 12,
        unique: true,
        validate: {
            validator:
                (email) => {
                    const regex = /^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/;
                    return regex.test(email);
                },
            message: '{VALUE} is invalid.'
        }
    },
    password: {
        type: String,
        required: true
    },
    username: {
        type: String,
        unique: true,
        required: true
    }
    posts: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Post'
    }],
    ...
}, { timestamps: true, toJSON: { virtuals: true }, toObject: { getters: true, virtuals: true } });

module.exports = mongoose.model('User', UserSchema);

当我将用户提取到数据库时:

const user = await User
                .findOne({ username })
                .populate({
                    path: 'posts',
                    model: 'Post',
                    select: 'description name photos comments createdAt',
                    options: {
                        limit: 3,
                        sort: { createdAt: -1 },
                    },
                    populate: {
                        path: 'author', //virtual <------- returns null but '_author_id' is fine
                        model: 'User',
                        select: 'username fullname profilePicture'
                    }
                })
                .sort('-createdAt');

返回文档示例

          {  
            ...
            "posts": [
            {
                "photos": [],
                "comments": [
                    "5fe96ec48564ce31dcebe669",
                    "5fe97c43f4169834a48b3851",
                    "5fe97c726ccf4633006fbeaa"
                ],
                "description": "Gago ka ba hahahaha",
                "_id": "5fe96d84178485086090faa9",
                "createdAt": "2020-12-28T05:30:44.157Z",
                "author": null, // <-----
                "id": "5fe96d84178485086090faa9"
            }
        ]
     }

我错过了什么吗?我的 author 虚拟在 non-nested 填充中工作正常。

1 个答案:

答案 0 :(得分:0)

我认为您需要在外部填充选择中添加作者。

const user = await User.findOne({ username })
    .populate({
        path: 'posts',
        select: 'description name photos comments createdAt author', // <------- try adding author here 
        options: {
            limit: 3,
            sort: { createdAt: -1 },
        },
        populate: {
            path: 'author', 
            select: 'username fullname profilePicture',
        },
    })
    .sort('-createdAt');


此外,您不必在填充中添加模型,因为它已经知道架构中的哪个模型。