Итак, вчера я начал возиться с MongoDB в Node, и когда дело дошло до извлечения данных, я столкнулся со странной практикой. Вы извлекаете данные из коллекции, вложенной в базу данных, путем вызова.
data = client.db([dbname]).collection([collectionname]).find([searchcriteria])
и это возвращает то, что кажется объектом, по крайней мере, в глазах typeof
Затем пример кода использует следующие строки для вывода его на консоль:
function iterate(x){
console.info(x)
}
data.forEach(iterate)
Вывод, как и ожидалось, в данном случае два объекта с 2 парами, пока все в порядке.
Я подумал, что функция итерации не нужна, поэтому я изменил ее на просто
console.info(data)
ожидая 2 объекта в массиве или вложенных в другой объект, но я получаю этот огромный объект со всеми видами разных вещей в нем ЗА ИСКЛЮЧЕНИЕМ двух объектов, которые мы видели раньше.
Итак, теперь к моему вопросу и тому, что мне нужно более глубокое объяснение:
почему я могу использовать .forEach()
на этом объекте, я не могу воссоздать это на других объектах.
и во-вторых, почему console.info(data)
дает мне весь этот вывод, который скрыт, если я вызываю его через .forEach()
?
и есть ли другой способ быстро в течение одной или двух строк кода получить данные из Mongo?
это кажется очень не полезным способом ведения дел.
и как работает эта штука .forEach()
с объектами? Я нашел статью здесь, в стеке, но она была не очень подробной и не очень простой для понимания.
Функция find
возвращает курсор — это огромный объект, который вы видите. Документация по оформлению заказа для получения более подробной информации здесь: https://docs.mongodb.com/manual/reference/method/db.collection.find/#db.collection.find
Причина, по которой вы можете вызывать forEach
для возвращаемого объекта (=курсор), заключается в том, что это один из его методов. См. https://docs.mongodb.com/manual/reference/method/cursor.forEach/#cursor.forEach
Обзор всех методов курсора здесь: https://docs.mongodb.com/manual/reference/method/js-cursor/
Чтобы получить массив данных, которые вы ищете, вам нужно использовать метод toArray
, например:
const data = client.db([dbname]).collection([collectionname]).find([searchcriteria]).toArray()
Спасибо. Вы были самым полезным парнем в этом сообществе, и вы были добры при этом! Впервые меня не линчевали за то, что я задал нубский вопрос, я, конечно, перерыл документы, но они довольно беспорядочны, и я не мог найти, что, может быть, я просто наблюдал за этим. Но спасибо за помощь не штатным, а новичкам.
forEach используется для объекта массива