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é.
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:
Explicación:
findOne
en la colección de autores para obtener el documento de Jane Austen. El segundo argumento defindOne
es una proyección que especifica que solo queremos que se devuelva el campobooks
, y no el campo_id
.map
para extraer los valores debook_name
del array de libros de Jane Austen. Esto nos da un array de nombres de libros.book_name
de al menos un libro en el arraybooks
coincida con uno de los nombres de libros de Jane Austen. Usamos el operador$in
para lograr esto. El argumento de proyección defind
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 deauthors
y el arraybooks
en la colección deorder
tienen el mismo esquema (es decir, contienen un campobook_name
). Si este no es el caso, deberás ajustar la consulta en consecuencia.