Tengo la siguiente estructura para los documentos:
{ companyId: string, language: string, country: string, template: string }Necesito hacer una sola llamada a la base de datos para obtener un documento, pero tengo tres formas de encontrarlo:
1 - {companyId: companyId, language: language} 2 - {companyId: companyId, language: languageCompany} 3 - {companyId: 'default', companyId: 'default', country: country} Y quiero que cada forma se aplique cuando la anterior ha fallado.
Por ejemplo:
Ejemplo de base de datos:
[{ companyId: 'companyId1', language: 'en', country: 'GB', template: '....' }, { companyId: 'companyId2', language: 'es', country: 'ES', template: '....' }, { companyId: 'default', language: 'default', country: 'ES', template: '....' }]Ejemplos de entradas y salidas:
Input 1 { companyId: 'companyId1', language: 'en', languageCompany: 'en', country: 'ES', } Output (apply first criteria): { companyId: 'companyId1', language: 'en', country: 'GB', template: '....' } Input 2 { companyId: 'companyId2', language: 'en', languageCompany: 'es', country: 'ES', } Output (apply second criteria): { companyId: 'companyId1', language: 'en', country: 'GB', template: '....' } Input 3 { companyId: 'companyId2', language: 'en', languageCompany: 'es', country: 'ES', } Output (apply third criteria): { companyId: 'companyId3', language: 'en', country: 'ES', template: '....' }Solo quiero hacer una llamada No vale hacer la primera llamada y si la segunda no devuelve nada, si la tercera no devuelve nada.
Os dejo este arenero por si os va bien: https://mongoplayground.net/p/CksyJE2nJsi
Muchas gracias por la ayuda :D
Puede usar la faceta para ejecutar múltiples consultas
db.collection.aggregate([ { $facet: { query1: [ { $match: { companyId: "companyId1", language: "en" } }, { $project: { _id: 0 } } ], query2: [ { $match: { companyId: "companyId2", language: "es" } }, { $project: { _id: 0 } } ], query3: [ { $match: { companyId: "default", country: "ES" } }, { $project: { _id: 0 } } ], } } ])Esto devolverá una matriz con todas las consultas. Tienes que quedarte con el primero que no esté vacío.
[ { "query1": [ { "companyId": "companyId1", "country": "GB", "language": "en", "template": "...." } ], "query2": [ { "companyId": "companyId2", "country": "ES", "language": "es", "template": "...." } ], "query3": [ { "companyId": "default", "country": "ES", "language": "default", "template": "...." } ] } ]https://mongoplayground.net/p/k3IAfiLi2Lf
En caso de que su base de datos tuviera estos datos:
[ { companyId: "othercompanyId1", language: "en", country: "GB", template: "...." }, { companyId: "othercCompanyId2", language: "es", country: "ES", template: "...." }, { companyId: "default", language: "default", country: "ES", template: "...." } ]Esto devolvería información en la tercera consulta:
[ { "query1": [], "query2": [], "query3": [ { "companyId": "default", "country": "ES", "language": "default", "template": "...." } ] } ]