Tengo documentos que contienen datos multilingües. Una versión simplificada se parece a:
{ languages: [ "en", "fr" ], title: { en: "Potato Gratin", fr: "Gratin de pomme de terre" }, }Las partes importantes son:
title contiene traducciones en la forma <lang> : <text>languages contiene la lista de idiomas admitidos, siendo el primero el idioma predeterminado.Lo que me gustaría hacer es consultar ese documento para un idioma específico y
title por la traducción correcta si el idioma es compatibletitle por la traducción predeterminada si el idioma no es Es decir, consultar el documento anterior en francés debería devolver {"title": "Gratin de pomme de terre"} y si se consulta en chino, debería devolver {"title": "Potato Gratin"}
Tengo una configuración de área de juegos: https://mongoplayground.net/p/CP0Z20dTpgy . Lo tengo para que establezca una propiedad lang en la que debería estar la salida. Luego me gustaría tener una etapa que se parezca a "$set": {"title": "$title.$lang"} pero se queja de que un componente de ruta de campo no debe comenzar con $ , lo que supongo significa que mongo no admite rutas de campo dinámicas.
¿Alguna idea de cómo lograr algo así?
Algunas notas:
Tienes que transformar tu objeto en una matriz con $objectToArray, filtrar esta matriz y obtener el elemento 0 de ella. Entonces puedes transformar tu valor.
db.collection.aggregate([ { "$match": { "_id": BinData(0, "3BByrilZQ2GTdlXG0nrGXw=="), }, }, { "$set": { "lang": { "$cond": [ { "$in": [ "zh", "$languages" ] }, "zh", { "$first": "$languages" } ] } } }, { $addFields: { title: { "$arrayElemAt": [ { "$filter": { "input": { "$objectToArray": "$title" }, "as": "title", "cond": { $eq: [ "$$title.k", "$lang" ] } } }, 0 ] } } }, { $addFields: { title: "$title.v" } } ])Por supuesto, debe pasar su 'zh' como parámetro en su código, en ambos lugares.