首页 > 解决方案 > Mongoose:是否可以在数组类型的字段上使用填充来仅返回该数组的 X 个元素?

问题描述

我有这个模型:

const UserSchema = new Schema({
  following: [
    {
      type: Schema.Types.ObjectId,
      ref: "users",
    },
  ],
});

module.exports = User = mongoose.model("users", UserSchema);

我想populatefollowing现场使用,只返回该数组的前 5 个元素。

这可以直接用填充来做到这一点吗?

我知道我最近可以在获取所有数组元素后执行此数组截断。但是,我正在做的是一个复杂的查询,我不想让它进一步复杂化。
谢谢你。

标签: node.jsmongodbmongooseormmern

解决方案


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 }
});

推荐阅读