> Как доставать данные из нескольких коллекций одновременно в базах данных (Node.js, JavaScript, MongoDB, Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: TrendTech

Стек: Node.js, JavaScript, MongoDB, Go

> Пример ответа

Для извлечения данных из нескольких коллекций MongoDB в Node.js используется агрегационный пайплайн с оператором $lookup. Это аналог JOIN в SQL. Пример:

JAVASCRIPT
const { MongoClient } = require('mongodb');
async function getOrdersWithUsers() {
const client = await MongoClient.connect('mongodb://localhost:27017');
const db = client.db('shop');
const result = await db.collection('orders').aggregate([
{
$lookup: {
from: 'users',
localField: 'userId',
foreignField: '_id',
as: 'user'
}
},
{ $unwind: '$user' },
{
$project: {
orderId: 1,
total: 1,
'user.name': 1,
'user.email': 1
}
}
]).toArray();
client.close();
return result;
}

Если нужно объединить данные из трех коллекций (например, заказы, пользователи, товары), добавляем второй $lookup:

JAVASCRIPT
db.collection('orders').aggregate([
{
$lookup: {
from: 'users',
localField: 'userId',
foreignField: '_id',
as: 'user'
}
},
{ $unwind: '$user' },
{
$lookup: {
from: 'products',
localField: 'productIds',
foreignField: '_id',
as: 'products'
}
}
])

Для простых случаев (небольшие коллекции) можно использовать два отдельных запроса и объединить на клиенте:

JAVASCRIPT
const user = await db.collection('users').findOne({ _id: userId });
const orders = await db.collection('orders').find({ userId }).toArray();
const combined = { user, orders };

Но агрегация эффективнее, так как выполняется на стороне БД, уменьшая сетевые задержки. В Go аналогично используется драйвер MongoDB с пайплайном через bson.D.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью