Когда использовать новый ObjectId (string-id) вместо ObjectId (string-id) в Mongoose?

Поскольку я хочу соответствовать своему коду (Node.js)

Когда у меня есть запрос и мне нужно найти что-то, используя значение id, которое является уникальным объектом, как лучше всего это сделать?

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

OR

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

Кажется неправильным создавать новый экземпляр и каждый раз заполнять память объектами.

Единственное разумное время использования new ObjectId — это когда данные вставляются для всех других операций, которые я бы использовал ObjectId?


person Eugen Sunic    schedule 27.12.2018    source источник


Ответы (4)


Проверка исходного кода:

/**
* 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

Для того, что я вижу, это то же самое, что делать new или ObjectId("82jf20k2k..."), как будто это не экземпляр ObjectID, он собирается создать новый экземпляр и вернуть его.

person Sid    schedule 27.12.2018
comment
Это то же самое, но зачем мне создавать экземпляр нового objectId вместо того, чтобы просто вызывать ObjectId, который возвращает идентификатор - person Eugen Sunic; 27.12.2018
comment
@eugensunic не просто возвращает идентификатор, он возвращает идентификатор, если это экземпляр ObjectId, поэтому вы получаете объект в обоих случаях - person Sid; 27.12.2018
comment
Извините, вы правы, это то же самое, я приму ваш ответ. - person Eugen Sunic; 27.12.2018

вы можете использовать его следующим образом:

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

нет необходимости в "ObjectId()", так как findOne попытается преобразовать строку в ObjectId.

Кроме того, если вы хотите искать документы по идентификатору, используйте findById, так как это более предпочтительно.

Ссылка: mongoose model.js из Github

person Rev    schedule 27.12.2018
comment
Глядя на исходный код, который предоставили другие, вы правы, однако запуск этого с монго не работает, вы должны предоставить идентификатор, я не уверен насчет мангуста, но не хочу полагаться на какой-то скрытый код, который мог или мог не совершать действия. - person Eugen Sunic; 27.12.2018

Вы должны использовать 2-й вариант, т.е.

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

вы правы 1-й создает ненужный объект в памяти. Ключевое слово New следует использовать, если вы хотите сгенерировать ObjectID во время выполнения.

person AJS    schedule 27.12.2018
comment
Хотя я согласен с вами, я действительно не понимаю, где именно это упоминается в документах. - person Eugen Sunic; 27.12.2018

Я бы посоветовал вам использовать Model.findById() вместо Model.findOne(_id:id), чтобы найти документ на основе его _id.

Вы также можете найти дополнительную информацию в документации Mongoose.

person kRiZ    schedule 27.12.2018