猫鼬findById不会返回所有字段

时间:2020-10-22 20:39:20

标签: node.js mongodb mongoose

我正在使用猫鼬调用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()的形式返回它们?

谢谢。

1 个答案:

答案 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],
});