एक्सप्रेस पर आधारित एक नोड.जेएस सर्वर में, नेवले के माध्यम से एक मोंगो डीबी के साथ बातचीत करते हुए, मैं केवल 'समीक्षा' सरणी पर एक 'समीक्षा' सम्मिलित करना चाहता हूं, यदि उपयोगकर्ता (उसकी आईडी द्वारा पहचाना गया) ने अभी तक उत्पाद की समीक्षा नहीं की है, अन्यथा, पहले डाली गई समीक्षा को अपडेट करें। निम्नलिखित मोंगो योजनाओं को देखते हुए:

उत्पाद:

var ProductSchema = new Schema({
  ownerId: {
    type: Schema.ObjectId,
    required: 'Owner of recharge point required'
  },
  name: {
    type: String,
    required: 'The name is required'
  },      
  description: {
    type: String
  },
  reviews: {
    type: [Review]
  }
});

समीक्षा करें:

  var ReviewSchema = new Schema({
  reviewerId: {
    type: ObjectId,
    required: 'Reviewer id required',
    ref: 'User' <not showed>
  },
  review: {
    type: String
  },
  date: {
    type: Date, 
    default: Date.now
  }
});

यही वह परिणाम है जिसके साथ मैं आया था, लेकिन यह केवल नई समीक्षाएं सम्मिलित करता है, यह उन्हें अभी तक अपडेट नहीं करता है। मुझे लगता है कि मेरे समाधान में बहुत सुधार किया जा सकता है (और सरलीकृत)।

exports.review_product = function (req, res) {
    const review = req.body.review;
    const reviewerId = req.body.reviewerId;
    const productId = req.params.productId;

    Product.findOne({_id: productId}, function(error, result){
          if(error) {
               res.status(500).send({message: error}).end()
           } else if(result){
               var newReview = new Review({ reviewerId: reviewerId, review: review});
               Product.findOneAndUpdate({ _id: productId, 'reviews.reviewerId': { $ne: reviewerId }}, 
                 { $push: { 'reviews': newReview}},
                 function(error, found) {
                     if (error) {
                        res.status(500).send({message: error}).end()
                     } else if(found) {
                        res.status(200).send({message: 'Review succefully added.'}).end()
                     } else {
                        res.status(404).send({message: 'You already reviewed this product'}).end()
                     }
              });
           } else {
               res.status(404).send({message: 'Cannot find the product to be reviewed.'}).end()
           }
  })
};
0
Giacomo Tontini 8 अक्टूबर 2019, 20:18

2 जवाब

आप फ़ंक्शन का उपयोग कर सकते हैं ()

उदाहरण के लिए:

var array = ["a","b","c"];
console.log(array.includes("a"); //return true
console.log(array.includes("z"); //return false because is not exist

अपने ऑब्जेक्ट द्वारा वेरिएबल स्ट्रिंग को बदलकर बस इसे अपने कोड में अनुकूलित करें

0
Nicolas Losson 8 अक्टूबर 2019, 20:24

सबसे अच्छा तरीका यह होगा कि किसी और चीज से पहले समीक्षक आईडी के लिए उत्पाद की जांच करने के लिए नेवला के साथ एक प्रश्न पूछें। आप async/प्रतीक्षा का उपयोग करके अपना कोड थोड़ा और पठनीय भी बना सकते हैं।

यह संभवतः कुछ ऐसा दिखाई देगा (कृपया ध्यान दें कि यह छद्म कोड है):

exports.reviewProduct = async (req, res) => {
    const review = req.body.review;
    const reviewerId = req.body.reviewerId;
    const productId = req.params.productId;

    const hasReviewed = await Product.find({_id: productId, 'reviews.reviewerId': { $eq: reviewerId } )

    if(hasReviewed) {
        Product.findOneAndUpdate({
            _id: productId, 
            reviews: { $elemMatch: { reviewerId: reviewerId } }
            },
            { $set: {
                'review.$.title': review.title,
                'review.$.body': review.body
             }},
             {'new': true, 'safe': true, 'upsert': true})
    } else {
        Product.findOneAndUpdate(
            { _id: productId }, 
            { $push: { reviews: review } },
            {safe: true, upsert: true, new : true},
            (err, model) => {
               console.log(err);
            })
    }
}
1
Jay Kariesch 9 अक्टूबर 2019, 15:55