মঙ্গোডিবির সন্ধান এবং ফাইডোন কলগুলির মধ্যে পার্থক্য


34

আমি একটি প্রকল্পে findকাজ করছি এবং কার্সার যেভাবে কাজ করে এবং যেভাবে কার্সার কাজ করে তার মধ্যে পার্থক্য থাকলে আমি নিশ্চিত নই findOne। সন্ধানের জন্য কি কেবল একটি মোড়কের জন্য find().limit(1)? আমি এটির জন্য সন্ধান করছিলাম এবং সম্ভবত কেউ জানেন যে এটির জন্য মঙ্গদ্ব্বের একটি বিশেষ পদ্ধতি আছে কি না। আমি যদি মঙ্গডবের জন্য কোনও পার্থক্য করে তবে পিএইচপি এপিআইয়ের সাথে কাজ করছি।

উত্তর:


33

আমার নিজস্ব মানদণ্ডের উপর ভিত্তি করে, এর চেয়ে আরও দ্রুততারfind().limit(1) আদেশগুলি ।findOne()

মঙ্গোডিবি ডকুমেন্টেশনে বা ত্রুটি রয়েছে findOne()। এন findOne()আরও find().limit(N)যেখানে ডকুমেন্টের সংখ্যা যেখানে কোয়েরিটি ফিরে আসবে সেভাবে আরও কার্য সম্পাদন করে । আমার সাধারণ জিজ্ঞাসাগুলি এত মন্থর কেন ছিল তা বের করার চেষ্টা করার সময় আমি এটি আবিষ্কার করেছি!

আপডেট: একটি 10gen (মঙ্গোডিবি) ইঞ্জিনিয়ারের প্রতিক্রিয়া:

আপনি যে দুটি ক্যোরিয়ালিটি সম্পাদন করছেন তা খুব আলাদা are অনুসন্ধানের অনুসন্ধানটি একটি কার্সারকে ফেরত দেয়, এটি মূলত একটি অপারেশন পরিস্থিতি, কারণ কোনও আসল তথ্য ফেরত পাওয়া যায় না (কেবলমাত্র কার্সারের তথ্য)। আপনি যদি ফাইডওনকে কল করেন তবে আপনি প্রকৃতপক্ষে ডেটা ফিরিয়ে দিচ্ছেন এবং কার্সারটি বন্ধ করছেন। ডক্স অবশ্যই স্পষ্টভাবে হওয়া উচিত :-)

আপডেট: প্রকৃতপক্ষে, find().limit(1)দস্তাবেজটি পুনরুদ্ধার করা হলে, প্রস্থের গতির পার্থক্যের ক্রমগুলি অদৃশ্য হয়ে যাবে বলে মনে হচ্ছে। এছাড়াও, আমি মঙ্গোডিবি জাভাস্ক্রিপ্ট ড্রাইভারের সাথে বড় গতির পার্থক্যটি পুনরুত্পাদন করতে পারিনি। আমি মঙ্গোডিবি জাভা ড্রাইভারটি ব্যবহার করে মূলত বেঞ্চমার্ক করেছি।


1
দুর্দান্ত খুঁজে। যদিও গুরুত্বপূর্ণ প্রশ্ন: find().limit(1)সাধারণ প্রোগ্রামিংয়ের সময় আপনার কী কী অতিরিক্ত ক্রিয়াকলাপগুলি করা উচিত (যেমন আসলে ডেটা উদ্ধার করা এবং কার্সার বন্ধ করে দেওয়া) যা findOne()স্বয়ংক্রিয়ভাবে আপনার জন্য কী করে?
নিক চ্যামাস

@ নিক: আমি মনে করি অতিরিক্ত অপারেশনগুলি কভার করা হয়েছিল। আমি একটি এলোমেলো দস্তাবেজ ( কুকবুক.মঙ্গোদবি.আর.প্যাটার্নস / র্যান্ডম- এট্রিবিউট ) সন্ধান করছি, .next () সহ নথিটি পেয়েছি এবং এটি সংগ্রহ থেকে সরিয়েছি। আমি ম্যানুয়ালি কোনও কার্সার বন্ধ করি নি ...
লেফটিয়াম

@ লিফটিয়াম তখন অবশ্যই আমাকে জিজ্ঞাসা করা উচিত যে একটি ফাইন্ডিং (দ্রুতগতি (1) করা এবং তারপরে কার্সার মান পাওয়া দ্রুত হয় বা একটি ফাইন্ডোন ()) করা খুব দ্রুত
ওয়াজন্সটেক

2
@ ভোজনসটেক: জেএসের একটি দ্রুত মাপদণ্ড দেখায় যে সন্ধান করুন () আসলে দ্রুততর। যদিও ড্রাইভার / প্ল্যাটফর্ম অনুসারে ফলাফল পৃথক হতে পারে। উদাহরণস্বরূপ, আমি জাভা ড্রাইভারের সাথে মূলত যাএসএসে পর্যবেক্ষণ করেছি সেটির প্রগতির গতির পার্থক্যের ক্রমগুলি পুনরুত্পাদন করতে পারিনি।
লেফটিয়াম

2
লেফটিয়াম, আমি আপনার উত্তরের চাপটি সম্পাদনা করব যে আপনি যখন নথিটি পুনরুদ্ধার করবেন (যা আপনি সাধারণত করবেন) তখন দুটি ফাংশন আসলে অভিন্ন, যেমন ডকুমেন্টেশনের বিবরণ রয়েছে। এখনই কেউ সম্ভবত আপনার উত্তরের শুরুতে সাহসী রেখাটি পড়বে এবং এই সিদ্ধান্তে পৌঁছে যাবে যে তারা যদি একটি নথি পুনরুদ্ধার করতে চায় তবে findOne()তার চেয়েও খারাপ find().limit(1), যা ভুল।
নিক চ্যামাস

5

findOne()প্রকৃতপক্ষে অন্বিত চিনি জন্য find().limit(1), দেওয়া আসলে আপনি নথির পুনরুদ্ধার করছি (শুধু সাথে কার্সারের ফেরার বিরোধিতা find())।

আরও বিশদের জন্য লেফটিয়ামের উত্তর এবং আপডেট দেখুন।


ঠিক আছে আপনাকে ধন্যবাদ আমি আমার প্রোগ্রামিংয়ে সিনিমাস ফাংশন ব্যবহার করতে চাই না বরং নিজের মধ্যে সীমাবদ্ধ রাখব যাতে আমার সমস্ত কোড ট্র্যাক করা সহজ হয়।
ওয়াজনসটেক

1
আসলে বেঞ্চমার্কগুলিতে FindOne () সন্ধান ()। সীমা (1) এর চেয়ে কিছুটা দ্রুত।
ভ্লাদিমির

@ ডায়ারট'আরগ - এই দাবির ব্যাক আপ করার যদি আপনার কাছে উত্স বা ডেটা থাকে তবে সমস্ত উপায়ে বিশদ সহ একটি উত্তর পোস্ট করুন! আমি এ পর্যন্ত যা সংগ্রহ করেছি, সেগুলি যতক্ষণ না আপনি উভয় ক্ষেত্রে নথিটি পুনরুদ্ধার করছেন ততক্ষণ তাদের অভিন্ন হওয়া উচিত
নিক চামাস

3

উত্স কোড অনেক সাহায্য করতে পারে।

এটি জাভা তবে আমার ধারণা এটিও সাহায্য করতে পারে।

দ্য findOne(),

DBObject findOne(DBObject o, DBObject fields, DBObject orderBy, ReadPreference readPref,
                 long maxTime, TimeUnit maxTimeUnit) {

    QueryOpBuilder queryOpBuilder = new QueryOpBuilder().addQuery(o).addOrderBy(orderBy)
                                                        .addMaxTimeMS(MILLISECONDS.convert(maxTime, maxTimeUnit));

    if (getDB().getMongo().isMongosConnection()) {
        queryOpBuilder.addReadPreference(readPref);
    }

    Iterator<DBObject> i = find(queryOpBuilder.get(), fields, 0, -1, 0, getOptions(), readPref, getDecoder());

    DBObject obj = (i.hasNext() ? i.next() : null);
    if ( obj != null && ( fields != null && fields.keySet().size() > 0 ) ){
        obj.markAsPartialObject();
    }
    return obj;
}

এবং এখানে find()

public DBCursor find( DBObject ref ){
    return new DBCursor( this, ref, null, getReadPreference());
}

যেহেতু আমরা দেখতে পাচ্ছি যে findOne()সেগুলিতে find()এটি কল রয়েছে, সমস্ত কিছু পেয়ে DBOjectযায় iএবং তারপরে প্রথমটি ফিরে আসে।


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