Estoy usando findOne() para extraer un documento. Al imprimir el valor devuelto, imprime el resultado correcto, pero al recorrerlo, imprime el modelo en lugar del documento original. El documento en la tabla City se almacena como:
{ _id: 62e135519567726de42421c2, configType: 'cityConfig' '16': { cityName: 'Delhi', metro: true, tier1: true }, '17': { cityName: 'Indore', metro: false, tier1: false } }El código -
const getCities = async () => { const cityConfig = await City.findOne({ configType: "cityConfig" }); console.log("cityConfig - ", cityConfig); let metroCities = []; for(var city in cityConfig) { console.log("city - ", city); if(cityConfig[city].metro == true) { // throws an error here obviously metroCities.push(city); } } return metroCities; }; La salida de cityConfig es correcta, pero dentro del ciclo for, itera sobre el modelo en lugar del documento. Producción -
cityPassConfig - { '16': { cityName: 'Nagpur', passIssuedCities: false, digitalDiscountEnabledCities: false, bhopalIndore: false, mPanelCitiesForPass: false }, '17': { cityName: 'Mumbai', passIssuedCities: false, digitalDiscountEnabledCities: false, bhopalIndore: false, mPanelCitiesForPass: false }, _id: 62e288807b59432f87e32a82, configType: 'cityPassConfig' } city - $__ city - isNew city - errors city - $locals city - $op city - _doc city - $init city - db city - discriminators city - configType city - cityId city - configData city - enabled city - lastModifiedby city - _id city - updatedAt city - createdAt . . . .Quiero que solo itere sobre 16 y 17 (las claves del objeto). ¿Como hacer eso? Versión del nodo - v14.15.4
El problema parece ser con su documento:
{ _id: 62e135519567726de42421c2, configType: 'cityConfig' // There should be a comma here, but not sure if that's affecting anything. '16': { cityName: 'Delhi', metro: true, tier1: true }, '17': { cityName: 'Indore', metro: false, tier1: false } } Tu '16' y '17' son hermanos con configType . Deberías tenerlo anidado dentro, por ejemplo.
{ _id: 62e135519567726de42421c2, configType: 'cityConfig', cityConfig: [ '16': { cityName: 'Delhi', metro: true, tier1: true }, '17': { cityName: 'Indore', metro: false, tier1: false } ] }Puede verificar las claves que son solo numbers .
const cityConfig = await City.findOne({ configType: "cityConfig", }); console.log("cityConfig - ", cityConfig); let metroCities = []; for (var city in cityConfig) { if (!isNaN(city)) { console.log("city - ", city); if (cityConfig[city].metro == true) { // throws an error here obviously metroCities.push(city); } } } return metroCities; };