何时在 Mongoose 中使用 new ObjectId("string-id") 而不是 ObjectId("string-id")?

When to use new ObjectId("string-id") over ObjectId("string-id") in Mongoose?

因为我想与我的代码保持一致(Node.js)

当我有一个查询并需要使用作为唯一对象的 id 值搜索某些内容时,执行它的最佳方法是什么?

User.findOne({id: new ObjectId("82jf20k2k...")}...

User.findOne({id: ObjectId("82jf20k2k...")}...

每次创建一个新实例并用对象填充内存似乎是错误的。

使用 new ObjectId 的唯一合理时间是为所有其他操作插入数据时我会使用 ObjectId?

您应该使用第二个选项,即

User.findOne({id: ObjectId("82jf20k2k...")}...

你是对的第一个是在内存中创建不必要的对象。如果您想在 运行 时生成 ObjectID,则应使用 New 关键字。

你可以这样使用它:

User.findOne({ id: "82jf20k2k..." })

不需要 "ObjectId()",因为 findOne 会尝试将字符串转换为 ObjectId。

此外,如果您想按 Id 搜索文档,请使用 findById,因为它更受欢迎。

参考: mongoose model.js from Github

检查source code

/**
* Create a new ObjectID instance
*
* @class
* @param {(string|number)} id Can be a 24 byte hex string, 12 byte binary string or a Number.
* @property {number} generationTime The generation time of this ObjectId instance
* @return {ObjectID} instance of ObjectID.
*/
var ObjectID = function ObjectID(id) {
  // Duck-typing to support ObjectId from different npm packages
  if (id instanceof ObjectID) return id;
  if (!(this instanceof ObjectID)) return new ObjectID(id);

  this._bsontype = 'ObjectID';

  // more code

据我所知,newObjectId("82jf20k2k...") 是同一件事,就好像它不是 ObjectID 的实例一样,它将创建一个新实例,而 return它。

我建议您使用 Model.findById() 而不是 Model.findOne(_id:id),以根据其 _id 查找文档。

您还可以在 Mongoose Documentation 上找到更多信息。