仅获取猫鼬虚拟填充的长度

Posted

技术标签:

【中文标题】仅获取猫鼬虚拟填充的长度【英文标题】:Get only the length of mongoose virtual populate 【发布时间】:2018-12-23 16:42:54 【问题描述】:

我想知道 Mongoose 中是否有一种方法可以将匹配的 localField/foreignField 的数量作为虚拟字段,而无需通过虚拟人口检索所有文档。

例子:

const ForumThreadSchema = new Schema(
    code:  type: Number, required: true, unique: true ,
    title:  type: String, min: [10, 'Too short title'], max: [200, 'Too long title'], required: true ,
    description:  type: String, min: [10, 'Too short description'], max: [2000, 'Too long description'], required: true ,
    creation_date:  type: Date, default: Date.now, required: true ,
    updated_date:  type: Date, default: Date.now, required: true ,
    _authorId:  type: Schema.ObjectId, ref: 'User', required: true ,
    _forumId:  type: Schema.ObjectId, ref: 'Forum', required: true 
, 
    collection: 'ForumThreads',
    toObject:  virtuals: true ,
    toJSON:  virtuals: true 
);

const ForumMessageSchema = new Schema(
    code:  type: Number, required: true, unique: true ,
    content:  type: String, min: [10, 'Too short message content'], max: [2000, 'Too long message content'], required: true ,
    creation_date:  type: Date, default: Date.now, required: true ,
    update_date:  type: Date, default: Date.now, required: true ,
    _authorId:  type: Schema.ObjectId, ref: 'User', required: true ,
    _forumThreadId:  type: Schema.ObjectId, ref: 'ForumThread', required: true ,
    _parentMessageId:  type: Schema.ObjectId, ref: 'ForumMessage' 
, 
    collection: 'ForumMessages'
);

论坛线程架构上的虚拟填充检索了我所有的消息文档。如果可能的话,我需要一个只有他们的数字的虚拟字段。

ForumThreadSchema
.virtual('messages', 
    ref: 'ForumMessage',
    localField: '_id',
    foreignField: '_forumThreadId'
);

ForumThreadSchema
.virtual('messages_count')
.get(function() 
    return this.messages.length;
);

第二个虚拟只有在第一个的填充完成后才有效。 我还想维护虚拟填充,但我想找到一种方法来获取匹配文档的数量而不使用它(在不需要所有消息文档而只需要它们的大小的服务器 API 中)。 有可能吗?

【问题讨论】:

【参考方案1】:

您只需要添加计数选项:

ForumThreadSchema
.virtual('messages_count', 
    ref: 'ForumMessage',
    localField: '_id',
    foreignField: '_forumThreadId',
    count: true
);

然后当你可以只填充计数时:

ForumThread.find().populate('messages_count')

文档:https://mongoosejs.com/docs/populate.html#count

【讨论】:

以上是关于仅获取猫鼬虚拟填充的长度的主要内容,如果未能解决你的问题,请参考以下文章

仅填充猫鼬中的特定字段

猫鼬虚拟填充无限循环

如何仅在猫鼬中使用聚合填充嵌套在对象数组中的字段?

无法在 NestJS 应用程序中启动并运行猫鼬虚拟填充

猫鼬模式设置字符串的最大长度[重复]

如何定义猫鼬模式中对象数组的最小长度?