首页 > 解决方案 > 如何返回 Mongoose 嵌套的对象数组

问题描述

我正在尝试返回我在猫鼬模型中声明的嵌套对象,如下所示:

const MessageSchema = new Schema({
    messageLog: [
        {
        transcript: {
            type: String
        },
        recipient: {
            type: Schema.Types.ObjectId,
            ref: 'User',
            required: true
        },
        sender: {
            type: Schema.Types.ObjectId,
            ref: 'User',
            required: true
        }
    }]
});

但是,当我尝试通过 graphql 解析器查询内部对象时,我无法取回内部对象的值(转录本、发件人、收件人在 gql 操场上为空,但在 db 中更新)我已将其设置如下:

query = args.messageId ? { _id: args.messageId } : { _id: new ObjectId() };

const message = await Message.findOneAndUpdate(query, {$addToSet: {messageLog: {transcript: args.messageBody, sender: args.senderId, recipient: args.recipientId}}}, {$setOnInsert: args, upsert: true, new: true, runValidators: true})
return message.messageLog;

我能够在数据库中创建新对象和嵌套的 messageLog,但由于某种原因我只能返回 id,而不是 messageLog 对象数组。通常问题在于我如何解决(解析器),但我也会把我的 typeDef 放在这里,以防问题在那里。

type Message {
        _id: ID
        transcript: [String]
        recipient: [User]
        sender: [User]
    }

标签: javascriptnode.jsmongodbmongoosegraphql

解决方案


因此,如果有人有类似的架构设置和问题,解决方案是也引用带有嵌套级别的 typeDefs。因此,由于转录本、收件人和发件人向下嵌套了一层,因此必须为嵌套对象定义 typeDef,然后在消息类型上引用如下:

type messageLog {
        _id: ID
        transcript: String
        recipient: User
        sender: User
    }
    type Message {
        _id: ID
        messageLog: [messageLog]
    }

并为用户使用填充,因为它是由 objectId 引用的模式


推荐阅读