Introducción

Entorno de trabajo

Crea un proyecto con Bun:

> mkdir database
> cd database
> bun init -y

Abre el proyecto con WebStorm.

Puedes gestionar la base de datos directamente desde la IDE:

Añade una dependencia con mongodb:

> bun add mongodb

Arranca la base de datos con los datos de muestra cargados:

> start-process -NoNewWindow mongod.exe

Modifica el fichero index.ts:

import {MongoClient} from "mongodb"

const uri = "mongodb://localhost:27017"
const client = new MongoClient(uri)

async function run() {
  try {
    const database = client.db('sample_mflix')
    const movies = database.collection('movies')
    
    // Pregunta por una película que tiene el título 'Back to the Future'
    const query = { title: 'Back to the Future' }
    const movie = await movies.findOne(query)
    
    console.log(movie)
  } finally {
    // Nos aseguramos que el cliente cerrará la conexión aunque se produzca un error
    await client.close()
  }
}

run().catch(console.dir)

Ejecuta el script para realizar la consulta:

> bun index.ts

El resultado és un objeto con los datos de la película:

{
  _id: new ObjectId('573a1398f29313caabce9682'),
  plot: "A young man is accidentally sent 30 years into the past in a time-traveling DeLorean invented by his friend, Dr. Emmett Brown, and must make sure his high-school-age parents unite in order to save his own existence.",
  genres: [ "Adventure", "Comedy", "Sci-Fi" ],

Find

Pots consultar un sol document d'una col·lecció amb el mètode collection.findOne(). El mètode findOne() utilitza un document de consulta que proporcioneu per coincidir només amb el subconjunt dels documents de la col·lecció que coincideixen amb la consulta. Si no proporcioneu un document de consulta o si proporcioneu un document buit, MongoDB coincideix amb tots els documents de la col·lecció.

L'operació findOne() només retorna el primer document coincident

Exemple

El fragment següent troba un sol document de la col·lecció movies. Utilitza els paràmetres següents:

  • Un document de consultaque configura la consulta per retornar només pel·lícules amb el títol exactament del text 'The Room'.

  • Un sort que organitza els documents coincidents en ordre descendent per puntuació, de manera que si la nostra consulta coincideix amb diversos documents, el document retornat serà el document amb la puntuació més alta.

  • Una projecció que exclou explícitament el camp _id dels documents retornats i que inclou explícitament només els camps title i imdb de l' objecte (i els seus camps incrustats).

import {MongoClient} from "mongodb"

const uri = "mongodb://localhost:27017"
const client = new MongoClient(uri)

type Movie = {
  title: string
  year: number
  released: Date
  plot: string
  type: "movie" | "series"
  imdb: IMDB
}

type IMDB = {
  rating: number
  votes: number
  id: number
}


type MovieSummary = Pick<Movie, "title" | "imdb">

async function run(): Promise<void> {
  try {
    const database = client.db("sample_mflix")
    // Specifying a Schema is always optional, but it enables type hinting on
    // finds and inserts
    const movies = database.collection<Movie>("movies")
    const movie = await movies.findOne<MovieSummary>(
      {title: "The Room"},
      {
        sort: {rating: -1},
        projection: {_id: 0, title: 1, imdb: 1},
      }
    );
    console.log(movie)
  } finally {
    await client.close()
  }
}

run().catch(console.dir)

Mira todos los ejemplos que hay en este enlace: Usage Examples

Atlas

Anañe la librería dotenv:

> bun add dotenv

Ves a la pantalla "Overview" del cluster, y ves al enlace dónde pone "Connect" para obtener la URI de conexión.

Crea el fichero .env en el directorio raíz del proyecto, y crea la variable DB_CONN_STRING:

DB_CONN_STRING="mongodb+srv://:@cluster0.2hr0xbm.mongodb.net"

Añade el fichero .env al fichero .gitignore para que no se guarde en git.

El código es el mismo que antes, excepto que la URI en lugar de estar en el mismo código está en una variable de entorno:

import dotenv from 'dotenv'

dotenv.config()

const uri = process.env.DB_CONN_STRING