Obtuve una matriz (como resultado de una consulta mongoDB) con algunos elementos como este:
{ "_id": "ExxTDXJSwvRbLdtpg", "content": [ { "content": "First paragraph", "language":"en", "timestamp":1483978498 }, { "content": "Erster Abschnitt", "language":"de", "timestamp":1483978498 } ] }Pero necesito obtener un solo campo de contenido para cada elemento de la matriz de datos, que debe seleccionarse según el idioma. Entonces, el resultado debería ser (suponiendo que seleccione el contenido en inglés):
{ "_id": "ExxTDXJSwvRbLdtpg", "content": "First paragraph" }en lugar de obtener todos los datos de contenido...
Traté de hacerlo con find(c => c.language === 'en) , pero no sé cómo usar esto para todos los elementos de la matriz de datos. ¿Tal vez también sea posible obtener los datos directamente como una consulta mongodb?
Puede iterar la matriz y reemplazar el valor dentro.
var array = [{ _id: "ExxTDXJSwvRbLdtpg", content: [{ content: "First paragraph", language: "en", timestamp: 1483978498 }, { content: "Erster Abschnitt", language: "de", timestamp: 1483978498 }] }]; array.forEach(a => a.content = a.content.find(c => c.language === 'en').content); console.log(array); Versión con control de content
var array = [{ _id: "ExxTDXJSwvRbLdtpg", content: [{ content: "First paragraph", language: "en", timestamp: 1483978498 }, { content: "Erster Abschnitt", language: "de", timestamp: 1483978498 }] }, { _id: "no_content" }, { _id: "no_english_translation", content: [{ content: "Premier lot", language: "fr", timestamp: 1483978498 }, { content: "Erster Abschnitt", language: "de", timestamp: 1483978498 }] }]; array.forEach(function (a) { var language; if (Array.isArray(a.content)) { language = a.content.find(c => c.language === 'en'); if (language) { a.content = language.content; } else { delete a.content; } } }); console.log(array);Dado que _id y language son variables de entrada, podría usar este comando agregado para obtener el resultado esperado:
db.collection.aggregate([{ $match: { _id: _id, } }, { $unwind: '$content' }, { $match: { 'content.language': language, } }, { $project: { _id: 1, content: '$content.content' } }])var aobjs = [{ "_id": "ExxTDXJSwvRbLdtpg", "content": [ { "content": "First paragraph", "language":"en", "timestamp":1483978498 }, { "content": "Erster Abschnitt", "language":"de", "timestamp":1483978498 } ] }]; var result = aobjs.map(o => ({ id: o._id, content: o.content.find(c => c.language === 'en').content }));Esto devuelve un objeto para cada uno con solo identificación y contenido. En este ejemplo, el resultado sería:
[ { id: 'ExxTDXJSwvRbLdtpg', contenido: 'Primer párrafo' } ]