我有一个集合模型,该模型具有项的属性,该属性具有项模型的数组。
const CollectionSchema = new mongoose.Schema({
title: {
type: String,
required: true
},
items : [{type : mongoose.Schema.Types.ObjectId, ref: 'Item'}]
});
我试图填充items数组以获取objectId的属性,但是items数组将返回为空。 (下面的代码是我填充项目数组的方式。我首先使用req.body.search通过_id查找了要查找的集合。然后我运行.populate(“ items”)来填充项目数组。我回来的是一个空项目数组。)
userRouter.post('/iList', passport.authenticate('jwt', {session: false}), (req, res) => {
Collection.findById({_id : req.body.search}).populate("items").exec((err, document) => {
if(err)
res.json(err)
else
res.json({item: document})
})
});
我知道我的项目数组不是空的,因为我可以检查mongoDB是否已满。 The image of my mongoDB collection with an items array that isn't empty.
奇怪的是,如果我将“集合”放入.populate参数中,则我的Items数组会返回东西,但它只会返回ObjectID,而不会返回实际的对象属性。我对为什么.populate(“ items”)无法正常工作感到困惑。
答案 0 :(得分:0)
如果您使用的是findById,那么为什么要指定{_id: req.body.search}
。如果您的req.body.search是猫鼬的ObjectId字符串,那么您可以直接使用findById(req.body.search)
代替它。您也可以只使用投影。查找调用中的第二个参数是投影
如果您尝试仅获取项数组,那么为什么不尝试此查询:-
Collection.findById(req.body.search, {items: 1}).then((result) => {
console.log('Items are :-\n', result);
}, (err) => {
console.log(err);
})
1表示包含,0表示排除。因此,项目将出现在输出中,而且_id是输出中的默认值。如果您要排除_id,则可以将第二个参数更改为-> {items: 1, _id: 0}
答案 1 :(得分:0)
没关系。问题是,当我通过猫鼬推送项目模型时,我忘了去做items.save(),这意味着item数组什么都没有。