当我使用聚合而不是findById

时间:2019-12-28 22:43:12

标签: node.js mongodb mongoose graphql

我正在使用GraphQL和MongoDB中的数据库在node.js中开发后端API。 问题是我需要查询一个模式,但要再加上一个fild,其中包含集合内部归档的数组的计数。

这是我需要查询的集合的模式:

const commentSchema = new Schema(
{
    type: {
        type: String,
        enum: ['STD', 'ANON'],
        default: 'STD'
    },
    text: {
        type: String,
        required: true
    },
    user: {
        type: Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
    post: {
        type: Schema.Types.ObjectId,
        ref: 'Post',
    },
    comment: {
        type: Schema.Types.ObjectId,
        ref: 'Comment',
    },
    subcomments: [
        {
            type: Schema.Types.ObjectId,
            ref: 'Comment'
        }
    ]
},
{
    timestamps: true
}

这是我用来将猫鼬集合转换为GraphQL可读的对象的功能

const transformComment = comment => {
return {
    ...comment._doc,
    _id: comment.id,
    user: user.bind(this, comment.user),
    post: post.bind(this, comment.post),
    comment: singleComment.bind(this, comment.comment),
    subcomments: comments.bind(this, comment._doc.subcomments),
    createdAt: new Date(comment._doc.createdAt).toISOString(),
    updatedAt: new Date(comment._doc.updatedAt).toISOString()
} }

发送像这样查询的评论对象时,效果很好:

const comment = await Comment.findById(args.commentId);
return transformComment(comment);

但是当我尝试转换通过聚合查询的对象时,出现错误“无法读取未定义的属性'subcomments'”:

    const comment = await Comment.aggregate([
                {$match: {_id: mongoose.Types.ObjectId(args.commentId)}},
                {$project: {type: 1, text: 1, user: 1, post: 1, createdAt: 1, updatedAt: 1, subcomments: 1, __v: 1, subcommentsCount: {$size: '$subcomments'}}}
            ]);
return transformComment(comment);

可能是什么问题? (对不起我的英语)

0 个答案:

没有答案