过滤器没有返回不同的ID而是返回所有内容

问题描述 投票:0回答:1

所以,我一直在尝试制作一个删除评论的功能,但它不起作用。我缩小了范围,似乎过滤器无法正常工作,无法找出原因。请检查代码并告诉我该怎么做:

//Delete review
exports.deleteReview=catchAsyncErrors(async(req,res,next)=>{
    //Find product by its Id
    const product=await Product.findById(req.query.productId);
    const reviewId=req.query.id.toString()

    if(!product){
        return next(new ErrorHandler("Product not Found!",400))
    }
    console.log('Review ID (from query):', reviewId);
    console.log('Existing reviews:', product.reviews);

    //Filter out the reviews by its _id
    const updatedReviews = product.reviews.filter(rev => {
        console.log('Review ID:', rev._id.toString(), '==', reviewId);
        return rev._id.toString() !== reviewId;
    });
    console.log('Updated reviews:', updatedReviews);

    //if the filter didn't work or invalid id

    if (updatedReviews.length === product.reviews.length) {
        return next(new ErrorHandler("Review not found. Invalid review ID", 400));
    }

    //Calculate the rating and new numofReviews
    let avg=0;
    if (updatedReviews.length > 0) {
        updatedReviews.forEach(rev => {
            avg += rev.rating;
        });
        avg /= updatedReviews.length;
    }

    //Update the product with new reviews,ratings and numOfReviews
    const updatedProduct=await Product.findByIdAndUpdate(req.query.productId,{
        reviews:updatedReviews,
        ratings:avg,
        numofReviews:updatedReviews.length
    },{
        new:true,
        runValidators:true,
        useFindAndModify:false
    })

    await product.save()

    res.status(200).json({
        success:true,
        updatedProduct
    })

})

//Route
//Delete a review
router.route("/review").delete(isAuthenticatedUser,deleteReview)

以下是数据库--

{
  "_id": {
    "$oid": "6686669d001eaace2f3cc103"
  },
  "name": "Product256",
  "description": "MSI Katana",
  "price": 200000,
  "ratings": 4.5,
  "images": [
    {
      "public_id": "Image abcde",
      "url": "SampleImageURI",
      "_id": {
        "$oid": "6686669d001eaace2f3cc104"
      }
    }
  ],
  "category": "Laptop",
  "stock": 3,
  "numofReviews": 2,
  "user": {
    "$oid": "6680fe296f7960665677f468"
  },
  "reviews": [
    {
      "user": {
        "$oid": "6680fe296f7960665677f468"
      },
      "name": "Someone1",
      "rating": 5,
      "comment": "Excellent!",
      "_id": {
        "$oid": "668684131c5010baf9c1fdf3"
      }
    },
    {
      "user": {
        "$oid": "668168d89de2122e5c13c8a9"
      },
      "name": "Someone2",
      "rating": 4,
      "comment": "uhfvkuh!",
      "_id": {
        "$oid": "6686842f1c5010baf9c1fdfa"
      }
    }
  ],
  "createdAt": {
    "$date": "2024-07-04T09:08:45.192Z"
  },
  "__v": 4
}

正如你所看到的,我尝试使用大量的 console.log 进行调试,这是一个结果 - //结果

[nodemon] restarting due to changes...
[nodemon] starting `node Backend/server.js`
Server is working on http://localhost:4000
MongoDb connected with server: 127.0.0.1
Review ID (from query): 6686842f1c5010baf9c1fdfa

Existing reviews: [
  {
    user: new ObjectId('6680fe296f7960665677f468'),
    name: 'Someone1',
    rating: 5,
    comment: 'Excellent!',
    _id: new ObjectId('668684131c5010baf9c1fdf3')
  },
  {
    user: new ObjectId('668168d89de2122e5c13c8a9'),
    name: 'Someone2',
    rating: 5,
    comment: 'Remove this!',
    _id: new ObjectId('6686842f1c5010baf9c1fdfa')
  }
]
Review ID: 668684131c5010baf9c1fdf3 == 6686842f1c5010baf9c1fdfa

Review ID: 6686842f1c5010baf9c1fdfa == 6686842f1c5010baf9c1fdfa

Updated reviews: [
  {
    user: new ObjectId('6680fe296f7960665677f468'),
    name: 'Someone1',
    rating: 5,
    comment: 'Excellent!',
    _id: new ObjectId('668684131c5010baf9c1fdf3')
  },
  {
    user: new ObjectId('668168d89de2122e5c13c8a9'),
    name: 'Someone2',
    rating: 5,
    comment: 'Remove this!',
    _id: new ObjectId('6686842f1c5010baf9c1fdfa')
  }
]

邮递员正在给出结果,但没有删除评论。

javascript node.js express mongoose
1个回答
0
投票

问题在于

_id
在每条评论中的结构。具体来说,
_id
字段嵌套在带有键
$oid
的对象内。

这是修复该问题的示例代码

const product = {
  "_id": {
    "$oid": "6686669d001eaace2f3cc103"
  },
  "name": "Product256",
  "description": "MSI Katana",
  "price": 200000,
  "ratings": 4.5,
  "images": [
    {
      "public_id": "Image abcde",
      "url": "SampleImageURI",
      "_id": {
        "$oid": "6686669d001eaace2f3cc104"
      }
    }
  ],
  "category": "Laptop",
  "stock": 3,
  "numofReviews": 2,
  "user": {
    "$oid": "6680fe296f7960665677f468"
  },
  "reviews": [
    {
      "user": {
        "$oid": "6680fe296f7960665677f468"
      },
      "name": "Someone1",
      "rating": 5,
      "comment": "Excellent!",
      "_id": {
        "$oid": "668684131c5010baf9c1fdf3"
      }
    },
    {
      "user": {
        "$oid": "668168d89de2122e5c13c8a9"
      },
      "name": "Someone2",
      "rating": 4,
      "comment": "uhfvkuh!",
      "_id": {
        "$oid": "6686842f1c5010baf9c1fdfa"
      }
    }
  ],
  "createdAt": {
    "$date": "2024-07-04T09:08:45.192Z"
  },
  "__v": 4
};

const reviewId = '6686842f1c5010baf9c1fdfa';  // Ensure reviewId is a string
// Here is the fix
const updatedReviews = product.reviews.filter(rev => {
    const reviewOid = rev._id.$oid;  // Access the $oid property
    console.log('Review ID:', reviewOid, '==', reviewId);
    return reviewOid !== reviewId;
});

console.log('Updated Reviews:', updatedReviews);
© www.soinside.com 2019 - 2024. All rights reserved.