猫鼬填充返回的ObjectId和空数组

时间:2020-09-15 22:27:54

标签: mongodb mongoose mongoose-schema mongoose-populate

我有一个集合模型,该模型具有项的属性,该属性具有项模型的数组。

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”)无法正常工作感到困惑。

2 个答案:

答案 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数组什么都没有。