Embedding stores related data inside one document, giving fast reads and atomic updates but risking large documents and duplication. Referencing stores IDs to other documents/collections, avoiding duplication and supporting large relationships, but requiring extra queries or $lookup.
Expanding on the short answer — what usually matters in practice:
A tiny example (query + projection):
// Example: query + projection
const user = await db.collection('users').findOne(
{ email: '[email protected]' },
{ projection: { _id: 0, email: 1, name: 1 } },
)