Mongoose 填充返回的 ObjectId 和空数组

Mongoose Populate Returning ObjectIds and Empty Arrays

我有一个集合模型,其中包含 属性 个包含项目模型数组的项目。

const CollectionSchema = new mongoose.Schema({
    title: {
        type: String,
        required: true
    },
    items : [{type : mongoose.Schema.Types.ObjectId, ref: 'Item'}]
});

我试图填充 items 数组以获取 objectId 的属性,但 items 数组 return 返回为空。 (下面的代码是我填充项目数组的方式。我首先使用 req.body.search 通过 _id 找到了我正在寻找的集合。然后我 运行 .populate("items") 以填充items 数组。我得到的是一个空的 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 数组会 return 处理内容,但它只是 return 对象 ID 而不是实际的对象属性.我对为什么 .populate("items") 不起作用感到困惑。

如果您使用的是 findById,那么为什么要指定 {_id: req.body.search}。如果您的 req.body.search 是一种猫鼬 ObjectId 字符串,那么您可以直接使用 findById(req.body.search) 代替它。您也可以简单地使用投影。 find 调用中的第二个参数是 projections

如果您只是尝试获取项目数组,那么为什么不试试这个查询:-

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}

没关系。问题是当我通过猫鼬推送项目模型时,我忘了做 items.save() 这意味着项目数组什么都没有。