আপনি কীভাবে কোনও মঙ্গুজ দলিলকে একটি সরল বস্তুতে পরিণত করবেন?


200

আমার কাছে একটি মঙ্গুজের একটি নথি আছে যা জেএসএন এনকোডিং এবং প্রতিক্রিয়া হিসাবে পাঠানোর আগে আমি প্রসারিত করতে চাই। আমি যদি দস্তাবেজের বৈশিষ্ট্যগুলি যুক্ত করার চেষ্টা করি তবে তা উপেক্ষা করা হবে। বৈশিষ্ট্যগুলি Object.getOwnPropertyNames(doc)কোনও সাধারণ প্রসারিত করা সম্ভব হয় না বলে উপস্থিত হয় না। আশ্চর্যের বিষয়টি হ'ল JSON.parse(JSON.encode(doc))সমস্ত বস্তুর সঠিক বৈশিষ্ট্য সহ কাজ করে এবং ফেরত দেয়। এই কাজ করতে একটি ভাল উপায় আছে কি?

উত্তর:


291

মঙ্গুজ Models এর উত্তরাধিকারী Document, যার একটি toObject()পদ্ধতি রয়েছে। আমি বিশ্বাস করি আপনি যা খুঁজছেন তার ফলাফল হওয়া উচিত doc.toObject()

http://mongoosejs.com/docs/api.html#document_Document-toObject


1
অবশেষে এটি পেয়েছি। যাদের টোঅবজেক্ট অনির্ধারিত রয়েছে তাদের জন্য, মডেলের পরিবর্তে নথিতে কল করতে ভুলবেন না। উদাহরণস্বরূপ মডেলনাম_ডোক.অটোজেক্ট ()
জন

1
এটি ঠিক আছে তবে পাতলা () পছন্দ হয়।
জেসন সেব্রিং 15

আপনি যদি Model.find({})ডক্সে অ্যারে ফিরিয়ে দেন তবে এই কাজটি কি আরে হয়? আপনি কি ডকস. টোবজেক্ট করতে পারবেন?
জ্যাক ফাঁকা

5
@ জ্যাকব্ল্যাঙ্ক যদি আপনার কাছে মডেলের একটি অ্যারে থাকে, তবে আপনি তাদের উপর মানচিত্র তৈরি করতে সক্ষম হবেন:var docArray = modelArray.map(function(model) { return model.toObject(); });
jmar777

@ jmar777 আমি মনে করি আপনার পরামর্শটি এই উত্তরের সম্পাদনা হিসাবে অন্তর্ভুক্ত।
r3wt

200

এটি করার আরেকটি উপায় হ'ল মঙ্গুজকে জানানো যে আপনার যা যা প্রয়োজন তা হ'ল lean()ক্যোয়ারী চেইনে ব্যবহার করে ফিরে আসা ডকটির একটি সাধারণ জাভাস্ক্রিপ্ট সংস্করণ । এইভাবে মঙ্গুজ পুরো মডেল উদাহরণ তৈরির পদক্ষেপ এড়িয়ে চলেছে এবং আপনি সরাসরি এমনটি পাবেন যা docআপনি সংশোধন করতে পারবেন:

MyModel.findOne().lean().exec(function(err, doc) {
    doc.addedProperty = 'foobar';
    res.json(doc);
});

16
@ স্টারটেক ইউজিংটি leanসাধারণত আরও পারফরম্যান্ট কারণ আপনি প্রথমে পুরো মঙ্গুজ ডকুমেন্ট তৈরির ওভারহেড এড়িয়ে যান।
জনিএইচকে

3
আপনি একজন চ্যাম্পিয়ন :) আমি ভুল হলে আমাকে সংশোধন করুন, তবে আপনি সন্ধান প্রাপ্ত ডকুমেন্টটি সংশোধন ও সংরক্ষণ করার ইচ্ছা না রাখলে আপনার সর্বদা আপনার অনুসন্ধান () গুলি ঝুঁকতে হবে (বলুন, আপনি যদি কেবল অ্যাক্সেস করার চেষ্টা করছেন তবে দস্তাবেজ করুন এবং এটি আপনার ক্লায়েন্টকে ফেরত প্রেরণ করুন)
অমর্ষ

1
@ আমারস হ্যাঁ, যদিও এটিও ধরে নিয়েছে যে আপনার কোনও স্কিমায় সংজ্ঞায়িত উদাহরণ পদ্ধতি বা গুণাবলী প্রয়োজন নেই।
জনিএইচকে

1
যদিও বিজারে ... এটি ফাইন্ড () এর সাথে একটি বিকল্প হতে পারে ... এটি একটি মংডব থেকে কোনও দস্তাবেজ পড়তে এবং এটি একটি ওয়েব ব্রাউজারে ফেরত পাঠানো প্রায়শই সাধারণ। আমি অবাক হয়েছি যদি সন্ধান করে ()। পাতলা () প্রকৃতপক্ষে প্রথমে সন্ধান করুন () এবং তারপরে ফলাফলের প্রতিটি উপাদানগুলির একটি হেলান () প্রয়োগ করুন, সেক্ষেত্রে, ()। পাতলা () সংমিশ্রণটি আবিষ্কারের চেয়ে ধীর হবে () নিজেই।
আমারশ

4
@ আমারশ নো, lean()ক্যোয়ারিতে শৃঙ্খলাবদ্ধ করে ক্যোয়ারীটি আসলে কার্যকর করার আগে (দ্বারা exec) বিকল্প নির্ধারণ করে যাতে ফলাফলগুলি সরাসরি তাদের "পাতলা" আকারে আসে। কল করার ইতিবাচক কর্মক্ষমতা প্রভাবের জন্য এই প্রশ্নটি দেখুন lean
জননিএইচকে

29

সম্পত্তি যদি মডেলটিতে না থাকে তবে দ্রুত উপায়:

document.set( key,value, { strict: false });


5
হ্যাঁ ... এবং যতটা অবাক লাগে ততই আমি এখনও মনে করি এটি কার্যকর হতে পারে। উদাহরণস্বরূপ আপনি আপনার সমস্ত বস্তুর আদিম রাখেন।
আলবান মাইলের

এই উত্তরের জন্য ধন্যবাদ, আমি যা খুঁজছিলাম এটি ছিল :)
datUser

6

ভালো একটি বিষয় মোকাবেলা একটি ভাল উপায় ব্যবহার করছে doc.toObject()এই রকম

doc.toObject({ getters: true })

অন্যান্য বিকল্পের মধ্যে রয়েছে:

  • getters: সমস্ত getters প্রয়োগ (পাথ এবং ভার্চুয়াল getters)
  • virtuals: ভার্চুয়াল getters প্রয়োগ (getters বিকল্প ওভাররাইড করতে পারেন)
  • minimize: খালি জিনিস অপসারণ (সত্য থেকে ডিফল্ট)
  • transform: ফিরে আসার আগে ফলাফল নথিতে প্রয়োগ করার জন্য একটি রূপান্তর ফাংশন
  • depopulate: যেকোন জনপথকে তাদের মূল রেফগুলি (মিথ্যাতে ডিফল্ট) দিয়ে প্রতিস্থাপন করুন
  • versionKey: সংস্করণ কী (সত্য থেকে ডিফল্ট) অন্তর্ভুক্ত করা হবে

উদাহরণস্বরূপ আপনি বলতে পারেন

Model.findOne().exec((err, doc) => {
   if (!err) {
      doc.toObject({ getters: true })
      console.log('doc _id:', doc._id)
   }
})

এবং এখন এটি কাজ করবে।

রেফারেন্স জন্য, দেখুন: http://mongoosejs.com/docs/api.html#document_Document-toObject


3

মঙ্গুজ দলিল থেকে সরল অবজেক্ট পেতে, আমি নীচে _docসম্পত্তি ব্যবহার করেছি

mongooseDoc._doc  //returns plain json object

আমি চেষ্টা করেছিলাম toObjectকিন্তু এটি আমাকে ফাংশন, যুক্তি এবং অন্যান্য সমস্ত জিনিস দেয় যা আমার প্রয়োজন হয় না।


3
_শুরুতে সম্পত্তি বা পদ্ধতিতে অ্যাক্সেস করা এটি আদর্শ সমাধান নয়। পাতলা ব্যবহার আপনার ক্ষেত্রে সমাধান হতে পারে।
আর্থার কস্তার

@ আর্থারব্রিটো হ্যাঁ এটি একটি আদর্শ সমাধান নয় তবে এটি এখনও একটি সমাধান! । উত্তর হ্রাস করার দরকার নেই। আমি _docকোনও সমস্যার মুখোমুখি না হয়ে সম্পত্তি বহুবার ব্যবহার করেছি । এবং leanপদ্ধতি ব্যবহার করা আপনাকে সাধারণ বস্তু দেয় যার উপর আপনি মঙ্গুসের মডেল ক্রিয়াকলাপগুলি সম্পাদন করতে পারবেন না।
dd619

তুমি ঠিক বলছো. আপনার উত্তরে কেবল যুক্ত করুন যা আদর্শ সমাধান নয় তবে আমি ডাউনটোটটি সরিয়ে ফেলব (আপনি সম্পাদনা না করেই আমি অপসারণ করতে পারব না)
আর্থার কোস্টা

2

আপনি অবজেক্টটি স্ট্রিংফাই করতে পারেন এবং তারপরে আবার স্বাভাবিক বস্তুটি তৈরি করতে পার্স করতে পারেন। যেমন:

const obj = JSON.parse(JSON.stringify(mongoObj))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.