Database Mongoosejs:findById比findOne快吗?

Database Mongoosejs:findById比findOne快吗?,database,mongodb,mongoose,mongodb-query,Database,Mongodb,Mongoose,Mongodb Query,我正在从事一个项目,其中一个用户可以有几个职位 所以我想知道哪种方法更适合查询他的所有帖子 在用户模型中有一个包含所有帖子ID的帖子字段,然后在包含所有用户所有帖子的帖子集合中通过FindById搜索每个帖子 一次查询所有帖子集合并查找给定用户的所有帖子 我将尝试回答标题中的问题以及您的特定用例,从标题开始 在用例的上下文之外,当提供有效的ObjectId时,findOne的速度可能不会太快,因为通过传递无效的ID。findOne({u ID})将不能确保\u ID是有效的ObjectId 但

我正在从事一个项目,其中一个用户可以有几个职位

所以我想知道哪种方法更适合查询他的所有帖子

  • 在用户模型中有一个包含所有帖子ID的帖子字段,然后在包含所有用户所有帖子的帖子集合中通过
    FindById
    搜索每个帖子

  • 一次查询所有帖子集合并查找给定用户的所有帖子


  • 我将尝试回答标题中的问题以及您的特定用例,从标题开始

    • 在用例的上下文之外,当提供有效的ObjectId时,findOne的速度可能不会太快,因为通过
      传递无效的ID。findOne({u ID})
      将不能确保
      \u ID
      是有效的ObjectId

    • 但是,给定格式错误的ID,
      .findById(\u ID)
      将阻止查询 执行任何操作并实际抛出一个
      CastError
      ,这 如果您不确定ID的来源,性能会更高, e、 g.用户输入,如果您希望提供错误消息而不是空结果,则具有额外的好处

    如前所述,这些细节似乎与您的用例无关,因为所讨论的ObjectId已经存储在数据库中,更不用说,这似乎是一个什么样的查询以什么顺序在理论上更快的问题,而不是一个查询助手比另一个查询助手更快

    • 如果您已经有了相关用户的ObjectId,那么可以通过直接查询Posts表来消除查询用户集合的需要,从而节省时间这是假设您在包含用户ID的字段上有一个标记。如您所建议的:
    Posts.find({userId})

    • 如果您还不知道用户的ID,它会很乐意使用文档技术,因为这与您的用例相匹配,并且可能已经为此目的进行了优化。
      Post
      User
      模型给出的一个(未测试)示例可能是:
    用户
    .findOne({foo:'bar})
    .populate('posts'))
    .选择('-id posts')

    这将返回一个对象,该对象具有一个包含POST数组的单键
    posts