问题描述
我正在使用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)