您好我有这个架构(称为schema.js):
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var RoomSchema = new Schema({
name: { type: String, required: true, index: { unique: true } },
people: { type: Number, required: true },
childrens: {type: Number, required: true},
total: {type: Number, required: true}
});
var Room = mongoose.model('Room', RoomSchema);
var AvSchema = new Schema({
roomId: {type: Schema.Types.ObjectId, ref: 'Room'},
people: { type: Number, required: true },
childrens: {type: Number, required: true},
total: {type: Number, required: true}
});
var Av = mongoose.model('Av', AvSchema);
module.exports = {
Room: Room,
Av: Av
};
在我的路线文件中:
module.exports = function(app) {
var model = require('../models/Schema');
app.get('/api/rooms', function(req, res) {
model.Room.find(function(err, rooms) {
if (err)
res.send(err);
res.json(rooms);
});
});
app.get('/api/av', function(req, res) {
model.Av.find().populate('roomId').exec(function(err, av) {
if (err)
res.send(err);
res.json(av);
});
});
};
db的图片:
GET / api / rooms - 回复:
[{
"_id": "5444d0dd9a31437167eea816",
"name": "Single",
"people": 1,
"childrens": 1,
"total": 4
}, {
"_id": "5444d1009a31437167eea817",
"name": "Double",
"people": 2,
"childrens": 2,
"total": 10
}]
当我打电话给api /房间看起来很好但是当我打电话给api / av我有一个空阵列[] ....知道我做错了吗?我应该提一下,我已经为两个roomsID
在av集合中插入了记录提前谢谢。
答案 0 :(得分:13)
默认情况下,Mongoose会将模型名称复数化以显示集合的名称,因此Mongoose会查找avs
集合而不是av
。
您可以通过将其作为第三个参数传递给model
来显式设置集合名称:
var Av = mongoose.model('Av', AvSchema, 'av');
答案 1 :(得分:2)
因为这是查询最受欢迎的结果
mongoose populate not working
我会列出它不适合我的原因,即使它不是这个已经解决的问题的直接答案,希望它能帮助某人
我遇到的问题是我在select({..}
中指定了字段,但没有指定我试图填充的字段。
答案 2 :(得分:1)
与CodyBugstein的答案类似,我正在发布为何它不适用于我的情况,即使它与OP的情况不同。
我试图在.post('save')
钩子中填充架构的“ pro”字段,如下所示:
mySchema.post('save', function(doc, next) {
console.log(doc.pro); // Expected to log ObjectID
doc.populate("pro"); // Populate field
console.log(doc.pro); // Expected to log actual pro document
}
但是,第二个console.log
也在记录ObjectID 而不是文档。
在为此苦苦挣扎了一个小时并尝试了不同的方法之后,我发现我所要做的就是使用诺言并调用execPopulate()
,以便它返回一个完整的诺言。我使用了async/await
,但您也可以使用.then
:
mySchema.post('save', async function(doc, next) {
console.log(doc.pro); // Expected to log ObjectID
await doc.populate("pro").execPopulate(); // Populate field
console.log(doc.pro); // Expected to log actual pro document
}
这样,第二个console.log
确实记录了整个专业文档:)
答案 3 :(得分:0)
不要忘记将ref属性添加到您要填充的属性的架构中。例如
// ...
const orderSchema = new mongoose.Schema({
userId: {
type: Types.ObjectId,
required: true
},
reservationId: {
type: Types.ObjectId,
required: true,
ref: 'Reservation' // <-- don't forget the ref
}
}, {
timestamps: true
})
// ...
答案 4 :(得分:0)
我遇到了同样的问题,但是没有一个答案对我有用。
我想在查询文档后填充它。
这不起作用:
// IIFE for async/await
( async() => {
var user = await User.findOne( { _id } );
await user.populate( 'comments' ); // Doesn't work
} );
在没有回调的情况下调用.populate()
时将不会执行的Mongoose Documentation explains。相反,您需要使用.populate().execPopulate()
:
// IIFE for async/await
( async() => {
var user = await User.findOne( { _id } );
await user.populate( 'comments' ).execPopulate(); // Works as expected
} );
答案 5 :(得分:0)
还要检查您的架构中没有将depopulate
中的toJSON
或toObject
选项设置为true。 (我自己是facepalm)
答案 6 :(得分:0)
对我来说,这是因为数据不正确。我要填充的ID已从主表中删除。 因此,当我进行填充时,由于ID不在表中,因此没有填充填充的数据。
答案 7 :(得分:-2)
对我来说,问题在于我不需要在文件的开头填充模型。