我正在使用猫鼬调用findById,它没有返回所有字段,或者至少它没有正确映射到字段。但是如果我使用聚合,它将返回该字段
我有以下模式
const ratingSchema = new mongoose.Schema({
rating: {
type: Number,
default: 0,
min: 0,
max: 5
}
})
const locationSchema = new mongoose.Schema({
name: {
type: String,
required: true,
},
address: {
type: String,
required: true,
},
rating: ratingSchema,
facilities: [String],
});
locationSchema.index({coords: '2dsphere'});
mongoose.model('Location', locationSchema);
当我打电话
const Loc = mongoose.model('Location');
const locationsReadOne = (req, res) => {
Loc
.findById(req.params.locationid)
.exec((err, location) => {
if (!location) {
return res.status(404).json({"message":"location not found"});
} else if (err) {
return res.status(404).json(err);
}
console.log("locationsReadOne:",location);
res.status(200).json(location);
});
};
它返回架构,但未返回评价字段。这是返回对象的console.log:
locationsReadOne: {
facilities: [ 'Hot drinks', 'Food', 'Premium wifi' ],
_id: 5f88bfdc4df4ca7709462865,
name: 'Starcups',
address: '125 High Street, Reading, RG6 1PS'
}
如果我致电Loc.aggregate,则返回等级字段:
{
_id: 5f8b2ee15b0b6784a847b600,
facilities: [ 'Tea', ' Restroom' ],
name: 'Tea Leaf',
address: '2192 Green St.',
rating: 0,
}
{
_id: 5f88bfdc4df4ca7709462865,
name: 'Starcups',
address: '125 High Street, Reading, RG6 1PS',
rating: 3,
facilities: [ 'Hot drinks', 'Food', 'Premium wifi' ]
}
知道为什么会这样吗?我可以在MongoDB罗盘中的每个文档中清楚地看到“评级”字段,它们都被列为Double类型。为什么要以总计而不是findById(id)甚至find()的形式返回它们?
谢谢。
答案 0 :(得分:3)
在猫鼬中使用find
时,它将使用架构中的字段填充文档。例如-如果您从架构中删除字段,则即使在数据库中,也可能不会在找到的文档中看到该字段。 Aggregate和Compass完全向您显示了数据库中的内容,因此数据就在那里了,只是没有在文档中填充数据,因为它在架构上看不到它。
其原因是您的ratingSchema
是具有rating
属性的对象。所以猫鼬正在寻找类似的东西:
{
name: ...
rating: {
rating: 2
}
}
没有找到它,所以没有填充。要解决此问题,我不会将等级定义为子模式,而是将您的架构定义为
const locationSchema = new mongoose.Schema({
name: {
type: String,
required: true,
},
address: {
type: String,
required: true,
},
rating: {
type: Number,
default: 0,
min: 0,
max: 5
},
facilities: [String],
});