Mongodb находит запись по собственному идентификатору, сгенерированному Node.js серверная часть

#node.js #mongodb #mongodb-query #mongodb-nodejs-driver

#node.js #mongodb #mongodb-запрос #mongodb-nodejs-driver

Вопрос:

Первый раз работаю с MongoDB. Этот запрос работает для меня в строке cmd:

 db.secrets.update({_id: ObjectId("5f767cd481cea1687b3dbf86")}, {$set: {secret_rating: 5}})
  

Однако обновление записи с использованием по существу того же запроса на моем узловом сервере не завершает эту задачу при пинге. Я ошибаюсь, пытаясь запросить такую запись в моей модели? ObjectId, очевидно, не является родным для моего сервера.

 db.secrets.update({_id: "5f767cd481cea1687b3dbf86"}, {$set: {secret_rating: 5}})
  

Ответ №1:

Предполагая, что вы используете драйвер Mongodb Nodejs, а не какой-либо ORM (поскольку он не был указан), возникают две проблемы:

  1. Насколько мне известно, если у вас есть объект подключения к нужной базе данных в db переменной, вы не можете напрямую ссылаться на коллекции, как вы это сделали db.secrets ; вместо этого вы должны использовать collection метод, подобный so:
 
const secrets = db.collection("secrets");

secrets.find({
    /*your query here*/
}).then((results) => {})
  

Итак, если вы не назначили db.secrets with db.collection("secrets") , вы должны получать сообщение об ошибке, Cannot read property "update" of undefined . Но я собираюсь предположить, что у вас есть объект коллекции db.secrets , поскольку вы не упомянули, что получаете эту ошибку.

  1. Похоже, вы используете строку вместо ObjectID объекта. Вы можете импортировать конструктор ObjectId из драйвера nodejs следующим образом:
 
const ObjectID = require('mongodb').ObjectID

  

Затем в вашем запросе вам нужно будет создать новый ObjectId, чтобы получить правильный результат:

 db.collection("secrets").find({
    _id: new ObjectID("5f767cd481cea1687b3dbf86")
}).then((results) => {})
  

ПРИМЕЧАНИЕ: ObjectID конструктор выдаст ошибку, если предоставленная ему строка не является допустимой шестнадцатеричной строкой из 24 символов, поэтому, если вы получаете id строку в качестве входных данных откуда-либо (скажем, как параметр в API или как аргумент командной строки), вы можете захотеть обернутьэто в функции, которая обрабатывает эту ошибку.