mongodb mongoose如何无法理解在填充的引用中找不到给定的id

问题描述

我正在使用mongoDB和mongoose在nodejs中创建shop api。我有两种称为用户和产品的模型:

let userSchema = new schema({
    username: {
        type: schema.Types.String,required: true
    },liked: [{
        type: schema.Types.ObjectId,ref: 'product'
    }]
})

每个用户都有一个喜欢的数组,其中只有产品的ObjectId作为引用存储在其中,我使用填充来获取产品的名称和价格,如下所示:

                let liked = await user.findOne({username: username},{"liked":1,"_id":0}).populate({
                    path: 'liked',options: {limit: 12,skip: (page - 1) * 12}
                })
                res.json(liked)

问题是,当用户喜欢某个产品并且将引用添加到喜欢的数组,并且当我获取该用户喜欢的产品时,商店的管理员将从产品列表中删除该产品,不会出现错误(很好!),并且仅提取产品列表中仍存在的喜欢的产品,而且我没有办法知道该产品已从数据库中删除,因此应从该用户的喜欢的数组中删除该产品。这样,由于存储在喜欢的用户数组中的对象ID不再存在,因此我的很多数据库空间将被填满

解决方法

我自己找到了这样的解决方案,虽然很费时,但效果很好:XD

let likedArray = await user.findOne({username: username}).select({"liked": 1,"_id": 0})

let liked = await user.findOne({username: username},{"liked":1,"_id":0}).populate({path: 'liked',options: {limit: 12,skip: (page - 1) * 12}})
if (liked.liked.length<12){
   let existingLiked = []
   for (const e of liked.liked) existingLiked.push(e._id)
   likedArray.liked.splice(((page - 1) * 12),12,...existingLiked)
                    await user.findOneAndUpdate({username: username},{liked:likedArray.liked},{useFindAndModify: false})}
let obj = {liked: liked.liked,count: count}
res.json(obj)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...