Mongoose 填充返回的 ObjectId 和空数组

Posted

技术标签:

【中文标题】Mongoose 填充返回的 ObjectId 和空数组【英文标题】:Mongoose Populate Returning ObjectIds and Empty Arrays 【发布时间】:2021-01-02 17:32:44 【问题描述】:

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

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

我尝试填充 items 数组以获取 objectId 的属性,但 items 数组将返回空。 (下面的代码是我如何填充 items 数组。我首先使用 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)
    )
);

我知道我的 items 数组不是空的,因为我可以在 mongoDB 上检查它是否已满。 The image of my mongoDB collection with an items array that isn't empty.

奇怪的是,如果我将“集合”放入 .populate 参数中,我的 Items 数组确实会返回内容,但它只返回 ObjectID 而不是实际的对象属性。我很困惑为什么 .populate("items") 不起作用。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

这确实有效,但结果再次注销了一个 objectID 数组而不是对象属性。我想查看对象属性而不是 objectID。【参考方案2】:

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

【讨论】:

以上是关于Mongoose 填充返回的 ObjectId 和空数组的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose JS - 填充方法不返回完整引用的对象... - 仅返回 objectId 版本

与 mongoDb 和 mongoose 聚合后填充单个 ObjectId 引用

Mongoose 填充返回空数组

Mongoose 填充返回空数组

Mongoose 不在数组的 objectid 中填充 objectid

Mongoose Populate Child ref 返回空数组