Как получить данные с вложенного JSON объекта MongoDB с nodeJS?

В MongoDB данные хранятся в формате BSON (Binary JSON), что позволяет хранить в документе множество вложенных JSON-объектов. Для доступа к данным вложенных JSON-объектов MongoDB предоставляет несколько способов.

Первый способ - использование "точечной нотации". При использовании этого способа вы указываете вложенность полей через точку. Например, если у вас есть коллекция, в которой каждый документ имеет следующую структуру:

{
   _id: ObjectId("5f2e84bfea9e5d5f0922e9a3"),
   name: "John",
   address: {
      street: "Main St",
      city: "New York",
      country: "USA"
   }
}

И вы хотите получить значение поля "street" из поля "address", то вы можете сделать это следующим образом:

const db = require('mongodb').MongoClient;

db.connect('mongodb://localhost:27017', { useNewUrlParser: true }, (err, client) => {
   if (err) throw err;
   
   const collection = client.db('mydb').collection('mycollection');
   
   collection.findOne({}, (err, doc) => {
      if (err) throw err;
      
      console.log(doc.address.street); // Выведет "Main St"
      
      client.close();
   });
});

Второй способ - использование оператора dot-notation $. Этот способ позволяет указывать вложенность полей в виде строки. Пример использования:

collection.findOne({}, { projection: {'address.street': 1}}, (err, doc) => {
   if (err) throw err;

   console.log(doc.address.street); // Выведет "Main St"

   client.close();
});

Третий способ - использование оператора $elemMatch. Этот способ используется для поиска объектов в массиве, и хорошо подходит для случаев, когда вложенные JSON-объекты хранятся в массиве. Пример использования:

collection.findOne({ 'arrayField': {$elemMatch: {'nestedField': 'value'}} }, (err, doc) => {
   if (err) throw err;

   console.log(doc.arrayField[0].nestedField); // Выведет значение поля nestedField

   client.close();
});

Надеюсь, эта информация будет полезна для вас при работе с вложенными JSON-объектами в MongoDB с использованием Node.js.