मेरे आदेश दस्तावेज़ों में, मेरे पास एक वर्तमान status संपत्ति है:

const StatusSchema = new Schema({
  code: {
    type: String,
    required: true,
    enum: ['pending', 'paid', 'failed'],
  },
  updatedAt: {
    type: Date,
    required: true,
    default: Date.now,
  },
})

मैं एक सरणी में अतीत स्थितियों का भी ट्रैक रखता हूं। तो, मेरे वास्तविक Order स्कीमा के भीतर, मेरे पास कुछ ऐसा है:

status: {
  type: StatusSchema,
},
statusHistory: [
  StatusSchema,
],

अब, जब मैं किसी ऑर्डर का status.code बदलता हूं, तो मैं चाहता हूं कि पिछली स्थिति को statusHistory में धकेल दिया जाए, हर बार मैन्युअल रूप से ऐसा किए बिना।

मेरी समझ यह है कि ऐसा करने का एक तरीका सबसे उपयुक्त तरीका होगा। तो मैंने लिखा है:

OrderSchema.methods.changeStatus = async function (status) {
  const order = await this.model('Order').findById(this.id)
  order.statusHistory.push(this.status)
  order.status = {
    code: status,
  }
  return order.save()
}

यह काम करने लगता है। हालांकि, जब मैं इसका उपयोग करता हूं जैसे:

const order = await Order.findById(id) // Has status "pending" here
await order.changeStatus('failed')
console.log(order.status) // Still pending, reference not updated

मेरा मूल order वैरिएबल यहां अपडेट नहीं होता है - कंसोल लॉग findById क्वेरी के माध्यम से प्राप्त किए गए मूल ऑर्डर को प्रिंट करेगा, इस तथ्य के बावजूद कि दस्तावेज़ को सफलतापूर्वक अपडेट और सहेजा गया है।

मैं एक नेवला विधि कैसे लिख सकता हूं जो चीजों को फिर से सौंपे बिना एक चर को अद्यतन करेगा?

1
j_d 19 अक्टूबर 2018, 16:32

1 उत्तर

सबसे बढ़िया उत्तर

आपकी changeStatus पद्धति में, आपके पास पहले से ही Order दस्तावेज़ है जिसे इसे this से उपलब्ध कराया गया था, इसलिए आपको findById को कॉल करने के बजाय इसे अपडेट करना चाहिए ताकि परिवर्तन प्रतिबिंबित हों कॉलिंग डॉक में।

OrderSchema.methods.changeStatus = function (status) {
  const order = this
  order.statusHistory.push(this.status)
  order.status = {
    code: status,
  }
  return order.save()
}
1
JohnnyHK 19 अक्टूबर 2018, 13:49