মোন্ডোডিবিতে FindAndModify এবং আপডেটের মধ্যে পার্থক্য কী?


175

আমি findAndModifyমঙ্গোডিবি- র পদ্ধতিতে কিছুটা বিভ্রান্ত হয়ে পড়েছি । updateপদ্ধতিতে এর সুবিধা কী ? আমার জন্য, দেখে মনে হচ্ছে এটি কেবল প্রথমে আইটেমটি ফিরিয়ে দেয় এবং তারপরে এটি আপডেট করে। তবে কেন আমাকে প্রথমে জিনিসটি ফেরত দেওয়া দরকার? আমি মঙ্গোডিবিটি পড়লাম : এর চূড়ান্ত গাইড এবং এটি বলে যে এটি সারিগুলিতে হেরফের করার জন্য এবং অন্যান্য ক্রিয়াকলাপ সম্পাদন করার জন্য কার্যকর যা গেট অ্যান্ড সেট স্টাইলের পারমাণবিকতার প্রয়োজন। তবে আমি বুঝতে পারি নি কীভাবে এটি এটি অর্জন করে। কেউ আমাকে এই ব্যাখ্যা করতে পারেন?

উত্তর:


153

আপনি যদি কোনও আইটেম আনেন এবং তারপরে এটি আপডেট করেন তবে এই দুটি পদক্ষেপের মধ্যে অন্য থ্রেডের দ্বারা আপডেট থাকতে পারে। আপনি যদি প্রথমে কোনও আইটেম আপডেট করেন এবং তারপরে এটি আনেন তবে এর মধ্যে অন্য একটি আপডেট থাকতে পারে এবং আপনি যা আপডেট করেছেন তার চেয়ে আলাদা আইটেম ফিরে পাবেন।

এটি "পরমাণু" করার অর্থ হল আপনি গ্যারান্টিযুক্ত যে আপনি ঠিক একই জিনিসটি আপডেট করছেন যা আপনি আপডেট করছেন - অর্থাৎ এর মধ্যে অন্য কোনও ক্রিয়াকলাপ ঘটতে পারে না।


6
আমি তখনও কিছুটা বিভ্রান্ত। কীভাবে findAndModifyগ্যারান্টি দেওয়া যায় যে এর সাথে আর কোনও আপডেট অপারেশন হস্তক্ষেপ করছে না?
চাঁইক্ষেত্রের

78
@ চাওনস্টিডোর সন্ধানআন্ডমোডিফাইটি যখন অপারেশন শুরু হয় তখন ডাটাবেজে একটি লক অর্জন করে যাতে এটি চালানোর সময় অন্য কোনও অপারেশন প্রক্রিয়া করতে পারে না। যখন এটি অপারেশন শেষ করে এটি লকটি প্রকাশ করে।
লিচা

4
FindAndModify অনুরোধের সংশোধিত অংশ না হওয়া পর্যন্ত আসলে একটি লকটি পায় না। সুতরাং একাধিক প্রক্রিয়া একই রেকর্ডটি আপডেট করতে সক্ষম হওয়া সম্ভব।
মার্ক আনসওয়ার্থ

5
@ মার্কউনসওয়ার্থ 10 জেনার সাহায্যে একটি সমর্থন কেস খুলুন - যদি ফাইন্ডএন্ডমডিফাইটি দিয়ে লক করতে কোনও বাগ থাকে তবে আমি গ্যারান্টি দিতে পারি যে আপনি ইঞ্জিনিয়াররা এটিকে ঠিক ঠিক করতে চান। যদি এমনটি হয় তবে আমরা দেখতে পাচ্ছি প্রচুর লোকেরা এই আচরণের প্রতিবেদন করে তবে FindAndModif এটি ব্যবহার করে এমন প্রত্যেকের জন্য নকশাকৃতভাবে কাজ করে - এমন ক্ষেত্রে যেখানে মনে হয়েছিল যে এটি ক্লায়েন্টের পক্ষ থেকে যুক্তি বা বাস্তবায়ন বাগে নেমে আসে নি cases , তবে অবশ্যই জটিল সফ্টওয়্যারটিতে সর্বদা একটি বাগ থাকতে পারে।
অস্যা কামস্কি

4
@ আস্যক্যামস্কি আমি আপনার সাথে তর্ক করার কথা ভাবছিলাম কিন্তু তখন বুঝতে পেরেছিলাম আপনি ঠিক আছেন তাই এখন আমি ভাবছি আমার ক্ষমা চাওয়া উচিত। দুঃখিত!
ফানকিআ

54

findAndModify নথিটি ফেরত দেয়, আপডেট দেয় না।

যদি আমি ডুইট মেরিম্যানকে (মঙ্গোডিবি-র অন্যতম মূল লেখক) সঠিকভাবে বুঝতে পারি, তবে একটি ডকুমেন্টকে পরিবর্তনের জন্য আপডেট ব্যবহার করে ("মাল্টি": ভুয়া }ও পারমাণবিক Currently বর্তমানে, এটি ব্যবহার করে সমমানের আপডেটের চেয়েও দ্রুত হওয়া উচিত) findAndModify


31

থেকে MongoDB ডক্স (জোর দেওয়া যোগ):

  • ডিফল্টরূপে, উভয় ক্রিয়াকলাপ একটি একক দস্তাবেজ পরিবর্তন করে। তবে এর মাল্টি অপশন সহ আপডেট () পদ্ধতিটি একাধিক ডকুমেন্টকে সংশোধন করতে পারে

  • যদি একাধিক ডকুমেন্টগুলি আপডেটের মানদণ্ডের সাথে মেলে, ফাইন্ডঅ্যান্ডমডিফাইটি () এর জন্য, আপনি কোন ডকুমেন্টটি আপডেট করবেন তা নিয়ন্ত্রণের কিছু পরিমাপ সরবরাহের জন্য একটি বাছাই নির্দিষ্ট করতে পারেন । আপডেট () পদ্ধতির ডিফল্ট আচরণের সাথে একাধিক ডকুমেন্ট মিলে আপনি কোন একক দস্তাবেজ আপডেট করবেন তা নির্দিষ্ট করতে পারবেন না।

  • ডিফল্টরূপে, findAndModify () মেথড ফেরৎ পূর্ব-পরিমার্জিত সংস্করণ দলিল । আপডেট করা ডকুমেন্টটি পেতে, নতুন বিকল্পটি ব্যবহার করুন। আপডেট () পদ্ধতিটি একটি WritResult অবজেক্ট প্রদান করে যা অপারেশনের স্থিতি রয়েছে। আপডেট করা দস্তাবেজটি ফিরে পেতে, () পদ্ধতিটি ব্যবহার করুন। তবে অন্যান্য আপডেটগুলি আপনার আপডেট এবং দস্তাবেজ পুনরুদ্ধারের মধ্যে দস্তাবেজটি সংশোধন করতে পারে। এছাড়াও, যদি আপডেটটি কেবল একটি একক দস্তাবেজকে সংশোধন করে তবে একাধিক নথি মিলে যায় তবে আপডেট হওয়া দস্তাবেজ সনাক্ত করতে আপনাকে অতিরিক্ত যুক্তি ব্যবহার করতে হবে।

  • মঙ্গোডিবি ৩.২ এর আগে আপনি ডিফল্ট লেখার উদ্বেগকে ওভাররাইড করতে FindAndModify () তে কোনও লেখার উদ্বেগ নির্দিষ্ট করতে পারবেন না তবে আপনি মোংগোডিবি ২.6 থেকে আপডেট () পদ্ধতিতে লেখার উদ্বেগ নির্দিষ্ট করতে পারেন

একটি একক দস্তাবেজকে সংশোধন করার সময়, FindAndModify () এবং আপডেট () পদ্ধতি উভয়ই নথিতে পরমাণুভাবে আপডেট করুন।


1
আপনি সর্বদা অপারেশন আপডেট করতে লেখার উদ্বেগ নির্দিষ্ট করতে পারেন। এছাড়াও, ৩.২ (প্রযুক্তিগতভাবে 3.1.1) থেকে আপনি অনুসন্ধানের জন্য লেখার উদ্বেগকেও নির্দিষ্ট করতে পারেন এবং পাশাপাশি অ্যাডমোডিফাইও করতে পারেন। jira.mongodb.org/browse/SERVER-6558
কামস্কি

আমি দেখেছি যে MongDB 3.6 যদিও যুক্তরাষ্ট্রে ডক রাজ্যের findAndModify()ডিফল্ট মডিফাই শুধুমাত্র একটি ডক দ্বারা update()করতে পারেন আপডেট এক বা একাধিক ডক, যখন আমি একটি ব্যবহার arrayFilters, findAndModify()সব ম্যাচ আপডেট। হতে পারে এটি একটি বাগ ??
ওয়েস্টার্নগুন

কোনও ত্রুটি নেই - অ্যারেফিল্টার আপনাকে একাধিক অ্যারে উপাদান আপডেট করার অনুমতি দেয় তবে তারা এখনও একটি নথিতে রয়েছে।
অস্যা কামস্কি

10

ব্যবহারের ক্ষেত্রে একটি কার্যকর শ্রেণি হল কাউন্টার এবং অনুরূপ কেস। উদাহরণস্বরূপ, এই কোডটি একবার দেখুন ( মঙ্গোডিবি পরীক্ষার মধ্যে একটি): find_and_modify4.js

সুতরাং, আপনার সাথে findAndModifyপাল্টা বৃদ্ধি করুন এবং এক ধাপে এর বর্ধিত মান পান। তুলনা করুন: যদি আপনি (ক) দুটি পদক্ষেপে এই অপারেশনটি করেন এবং অন্য কেউ (খ) আপনার পদক্ষেপগুলির মধ্যে একই ক্রিয়াকলাপ করেন তবে এ এবং বি দুটি পৃথক (সম্ভাব্য সমস্যার মাত্র একটি উদাহরণ) এর পরিবর্তে একই শেষ কাউন্টার মান পেতে পারে।


0

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

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