findOne() 返回整个模型而不是文档

问题描述 投票:0回答:4

我正在使用

findOne()
来提取文档。在打印返回值时,它会打印正确的结果,但在循环时,它会打印模型而不是原始文档。
City
表中的文档存储为:

{
 _id: 62e135519567726de42421c2,
configType: 'cityConfig'
'16': {
        cityName: 'Delhi',
        metro: true,
        tier1: true
      },
'17': {
        cityName: 'Indore',
        metro: false,
        tier1: false
      }
}

代码:

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;

};

cityConfig
的输出是正确的,但在
for
循环内,它迭代的是模型而不是文档。 输出:

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
.
.
.
.

我只想迭代 16 和 17(对象的键)。如何做到这一点?

节点v14.15.4

javascript node.js mongodb express mongoose
4个回答
1
投票

您使用的是 Mongoose,所以如果您想返回 JavaScript 对象,您应该使用

lean()
方法。

const cityConfig = await City.findOne({ configType: "cityConfig" }).lean();

如果您不使用

lean()
,Mongoose 会对文档进行水合处理。您可以在这里阅读更多内容。


1
投票

问题似乎出在您的文档上:

{
    _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
    }
}

您的

'16'
'17'
configType
的兄弟姐妹。你应该把它嵌套在里面,例如

{
    _id: 62e135519567726de42421c2,
    configType: 'cityConfig',
    cityConfig: [
        '16': {
            cityName: 'Delhi',
            metro: true,
            tier1: true
        },
        '17': {
            cityName: 'Indore',
            metro: false,
            tier1: false
        }
    ]
}

0
投票

您只能检查

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;
};

0
投票

默认情况下,Mongoose 查询返回 Mongoose Document 类的实例,您可以在结果的

_doc
中找到该对象。

如果您不需要所有这些信息,请使用 .lean(),它还会使你的查询更快并且占用更少的内存。

const cityConfig = await City.findOne({ configType: "cityConfig" }).lean();

然后您可以像现在一样进行迭代,使用

.lean()
或尝试
for(var city in cityConfig._doc)

© www.soinside.com 2019 - 2024. All rights reserved.