我正在使用
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
您使用的是 Mongoose,所以如果您想返回 JavaScript 对象,您应该使用
lean()
方法。
const cityConfig = await City.findOne({ configType: "cityConfig" }).lean();
如果您不使用
lean()
,Mongoose 会对文档进行水合处理。您可以在这里阅读更多内容。
问题似乎出在您的文档上:
{
_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
}
]
}
您只能检查
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;
};
默认情况下,Mongoose 查询返回 Mongoose Document 类的实例,您可以在结果的
_doc
中找到该对象。
如果您不需要所有这些信息,请使用 .lean(),它还会使你的查询更快并且占用更少的内存。
const cityConfig = await City.findOne({ configType: "cityConfig" }).lean();
然后您可以像现在一样进行迭代,使用
.lean()
或尝试 for(var city in cityConfig._doc)