node.js - mongodb mongoose如何理解给定的id在填充的ref中找不到
问题描述
我正在使用 mongoDB 和 mongoose 在 nodejs 中创建商店 api。我有两个模型,称为用户和产品,如下所示:
let userSchema = new schema({
username: {
type: schema.Types.String,
required: true
},
liked: [{
type: schema.Types.ObjectId,
ref: 'product'
}]
})
每个用户都有一个喜欢的数组,其中只有产品的 ObjectId 作为参考存储在其中,我使用 populate 来获取产品的名称和价格,如下所示:
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)