node.js - Mongoose:是否可以在数组类型的字段上使用填充来仅返回该数组的 X 个元素?
问题描述
我有这个模型:
const UserSchema = new Schema({
following: [
{
type: Schema.Types.ObjectId,
ref: "users",
},
],
});
module.exports = User = mongoose.model("users", UserSchema);
我想populate
在following
现场使用,但只返回该数组的前 5 个元素。
这可以直接用填充来做到这一点吗?
我知道我最近可以在获取所有数组元素后执行此数组截断。但是,我正在做的是一个复杂的查询,我不想让它进一步复杂化。
谢谢你。
解决方案
https://mongoosejs.com/docs/populate.html#limit-vs-perDocumentLimit
填充确实支持限制选项,但是,它目前不限制每个文档的向后兼容性。例如,假设您有 5 个以下项:
限制
如果您想获得总共 5 个following
而不考虑用户数量
const users = await User.find().populate({
path: 'following',
options: { limit: 5 }
});
这是因为,为了避免对每个文档执行单独的查询,Mongoose 改为使用 numDocuments * limit 作为限制来查询粉丝。如果您需要正确的限制,您应该使用 perDocumentLimit 选项(Mongoose 5.9.0 中的新选项)。请记住,populate() 将为每个故事执行单独的查询,这可能会导致 populate() 变慢。
perDocumentLimit
如果您希望每个用户总共获得5 个关注
一个特殊的选项,告诉 Mongoose 为每个用户执行单独的查询,User
以确保我们following
为每个用户获得 5 个。
const users = await User.find().populate({
path: 'following',
options: { perDocumentLimit: 5 }
});
推荐阅读
- java - 使用 java 代码以编程方式生成由 eclipse IDE 生成的 Getter 和 Setter
- sql - 现有列的表中没有新行的命令
- sql - T-SQL 中的字符串循环
- spring - Spring 自动配置,@ConditionalOnBean 和 @Repository
- vim - 可视选择特定字符
- python-3.x - 向 amazon.in 发送 GET 请求,但网络服务器响应代码为 503,该怎么办?
- python - 'pip' 未被识别为内部或外部命令(我尝试将 pip 添加到我的路径中)
- c - 在python进程中,C语言函数调用python脚本方法但导致段错误
- python - 为什么在 Django 中使用自定义后端时用户没有登录?
- android - 单击即可清除文本