database - 只获取 mongoose virtual populate 的长度

标签 database mongoose schema virtual populate

我想知道 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 中)。 可能吗?

最佳答案

你只需要添加计数选项:

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

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

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

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

关于database - 只获取 mongoose virtual populate 的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51356660/

相关文章:

mongodb - 如何根据OR条件查询mongoose

sql - 什么是扩展 SQL 模式?

json - Azure 常见警报架构将 commonPropertie 设置为 "null"

python - 为什么这不是 Rx 的有效模式?

php - 不使用ID返回随机行,MySQL

Mysql 查询检索关系表中缺失的组合

node.js - 使用 findOneAndRemove Mongoose 删除文档

javascript - 查找字段大于嵌入数组长度的文档

java - 在 play 2.0.3 中,我有 'sets' 个图像,我想在启动服务器时对其进行分类并放入数据库中

数据库设计--一张表中有数十亿条记录?