es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

EN Consulta de MongoDB

Supongamos que tengo dos colecciones: una con autores y un array de sus libros y otra con órdenes y un array de libros:

Autores:

{
    "_id": 1,
    "name": "Jane Austen",
    "books": [
        { "book_name": "Orgullo y prejuicio", "pages": 325 },
        { "book_name": "Persuasión", "pages": 355 }
    ]
},
{
    "_id": 2,
    "name": "Mark Twain",
    "books": [
        { "book_name": "Tom Sawyer", "pages": 500 }
    ]
}

Órdenes:

{
    "_id": ID_Orden,
    "total": 500,
    "books": [
        { "book_name": "Orgullo y prejuicio", "pages": 325 }
    ]
}

¿Cómo puedo imprimir “qué órdenes contenían libros” de “Jane Austen”?

Intenté hacer lo siguiente:

var austen = db.authors.find({name: "Jane Austen"}, {books: 1, _id: 0});

Esto imprimiría todos los libros de Jane Austen como autor.

Luego intenté hacer:

db.order.find({ books{ $in: [austen] } }, { _id: 0 })

Sin embargo, no parece darme ningún resultado y no estoy seguro de por qué.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para imprimir qué pedidos contienen libros de “Jane Austen”, primero debemos filtrar la colección de autores para obtener solo al autor con el nombre “Jane Austen” y extraer los nombres de sus libros. Luego, podemos buscar en la colección de pedidos todos los pedidos que contengan uno de esos nombres de libros.

    Aquí hay una forma de hacerlo en el lenguaje de consulta de MongoDB:

    // Encontrar los libros de Jane Austen
    var austenBooks = db.authors.findOne({ name: "Jane Austen" }, { books: 1, _id: 0 }).books.map(function(book) { return book.book_name; });
    
    // Encontrar pedidos que contengan los libros de Austen
    db.order.find({ "books.book_name": { $in: austenBooks } }, { _id: 0 })
    

    Explicación:

    • Primero llamamos a findOne en la colección de autores para obtener el documento de Jane Austen. El segundo argumento de findOne es una proyección que especifica que solo queremos que se devuelva el campo books, y no el campo _id.
    • Usamos la función map para extraer los valores de book_name del array de libros de Jane Austen. Esto nos da un array de nombres de libros.
    • Buscamos en la colección de pedidos todos los pedidos donde el campo book_name de al menos un libro en el array books coincida con uno de los nombres de libros de Jane Austen. Usamos el operador $in para lograr esto. El argumento de proyección de find especifica que no queremos que se devuelva el campo _id en los resultados.

    Es importante tener en cuenta que esta consulta asume que el array books en la colección de authors y el array books en la colección de order tienen el mismo esquema (es decir, contienen un campo book_name). Si este no es el caso, deberás ajustar la consulta en consecuencia.

Comments are closed.