Digamos que tengo las siguientes dos colecciones, sites y webpages . Estoy tratando de entender cómo crear una agregación que me permita combinar los valores de un documento de la colección de sites y usarlo para buscar un valor de la colección de webpages . Además, necesito anteponer los valores combinados con una cadena.
// sites collection [ { "_id" : 3, "host" : "www.example-foo.com", "path": "/bar", "hasVisited": false }, ] // webpages collection [ { "_id" : 5, "url" : "https://www.example-foo.com/bar" }, { "_id" : 8, "url" : "https://www.fizz.com/buzz" }, ]Sin una agregación, haría algo como lo siguiente.
const site = await db.sites.findOne({ hasVisited: { $eq: false } }); const pages = await db.webpages.find({ url: `https://${site.host}${site.path}`, // <--- how to construct this in a lookup aggregation? string + value + value }); // pages = [{ "_id" : 5, "url" : "https://www.example-foo.com/bar" }]Esto es como la traducción de su código con las 2 consultas de búsqueda en 1 usando $lookup
Consulta
$match y el $limit 1$set url es hacer que la cadena se concatene$lookup (con el sitio 1 de las etapas anteriores)*si desea hacerlo para más de 1 sitio, elimine el límite y proyecte más campos, para saber a dónde pertenecen estas páginas (a qué sitio)
db.sites.aggregate([ { "$match": { "hasVisited": { "$eq": false } } }, { "$limit": 1 }, { "$set": { "url": { "$concat": [ "https://", "$host", "$path" ] } } }, { "$lookup": { "from": "webpages", "localField": "url", "foreignField": "url", "as": "pages" } }, { "$project": { "_id": 0, "pages": 1 } } ])