মংডোবে শেষ এন রেকর্ডগুলি কীভাবে পাবেন?


523

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

সম্পাদনা করুন: এছাড়াও আমি প্রত্যাবর্তিত ফলাফলটি সাম্প্রতিক থেকে সাম্প্রতিক সময়ে অর্ডার করা চাই, বিপরীত নয়।


7
@ হাইম, প্লাজ উত্তরটি নির্দিষ্ট করতে হবে, ওয়েব পৃষ্ঠার কোন অংশটি আমার প্রশ্নের সমাধান করে?
বিন চেন

হাই @ বিনচেন, সম্প্রতি আমারও একই সমস্যা হয়েছে, এটি কি সমাধান হয়েছে?
হ্যান্টন

উত্তর:


736

যদি আমি আপনার প্রশ্নটি বুঝতে পারি তবে আপনাকে আরোহী ক্রম অনুসারে বাছাই করতে হবে।

ধরে নেওয়া আপনার "আইডি" নামক কিছু আইডি বা তারিখের ক্ষেত্র রয়েছে যা আপনি করবেন ...

.সাজান()


db.foo.find().sort({x:1});

1 আরোহী বাছাই হবে (নবীনতম প্রাচীনতম) এবং -1 সাজানোর সাজানো হবে (প্রাচীনতম থেকে নবীনতম।)

আপনি যদি স্বয়ংক্রিয়ভাবে তৈরি _id ক্ষেত্রটি ব্যবহার করেন তবে এতে একটি তারিখ এমবেড করা আছে ... যাতে আপনি এটি অর্ডার করতে ব্যবহার করতে পারেন ...

db.foo.find().sort({_id:1});

এটি আপনার পুরানো থেকে নতুনকে সাজানো সমস্ত দস্তাবেজ ফিরিয়ে দেবে।

প্রাকৃতিক আদেশ


আপনি উপরে উল্লিখিত একটি প্রাকৃতিক আদেশও ব্যবহার করতে পারেন ...

db.foo.find().sort({$natural:1});

আবার, আপনি চান অর্ডার উপর নির্ভর করে 1 বা -1 ব্যবহার ।

.মিলিট () ব্যবহার করুন


শেষ অবধি, এই ধরণের প্রশস্ত ওপেন কোয়েরি করার সময় একটি সীমা যুক্ত করা ভাল অনুশীলন যাতে আপনি যা করতে পারেন ...

db.foo.find().sort({_id:1}).limit(50);

অথবা

db.foo.find().sort({$natural:1}).limit(50);

11
@MortezaM। আমি নিশ্চিত যে আপনার কোয়েরি অর্ডারটি মিশ্রিত হয়ে গেছে ... আপনার সাজান ()টি সর্বশেষে চালানো উচিত (অনেকটা এসকিউএল অর্ডার বাছাইয়ের
জাস্টিন জেনকিন্স

6
এটি কখনই হয়, কলিং ফাংশনগুলির ক্রমটির শেষ ফলাফলের সাথে কোনও সম্পর্ক নেই।
মরতেজা মিলানি

7
@MortezaM। অবশ্যই অর্ডারটি গুরুত্বপূর্ণ। item = 3; item.add(3).divide(3) == 2; item.divide(3).add(3) == 4;বিনা আদেশে পরিণতি কী হবে ??? আমি আপনার সাথে একমত যে এই বিপরীত আদেশটি স্বজ্ঞাত নয়। এটি কোনও সাধারণ এস-এসকিউএল নয় যা সাধারণ ওওর উদাহরণগুলি অনুসরণ করে follow
রিকিএ

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

9
দস্তাবেজগুলি নিশ্চিত করে যে
আদেশটির কোনও গুরুত্ব

120

সর্বশেষ এন যুক্ত রেকর্ডগুলি, সাম্প্রতিককালের থেকে সাম্প্রতিকতম পর্যন্ত এই ক্যোয়ারির সাথে দেখা যেতে পারে:

db.collection.find().skip(db.collection.count() - N)

যদি আপনি তাদের বিপরীত ক্রমে চান:

db.collection.find().sort({ $natural: -1 }).limit(N)

আপনি যদি মঙ্গো-হ্যাকার ইনস্টল করেন তবে আপনি এটি ব্যবহার করতে পারেন:

db.collection.find().reverse().limit(N)

আপনি যদি সমস্ত সময় এই আদেশগুলি লিখতে ক্লান্ত হয়ে পড়ে থাকেন তবে আপনি নিজের। / .Mongorc.js এ কাস্টম ফাংশন তৈরি করতে পারেন। যেমন

function last(N) {
    return db.collection.find().skip(db.collection.count() - N);
}

তারপরে একটি মঙ্গো শেল থেকে কেবল টাইপ করুন last(N)


1
db.collection.find().reverse().limit(1)আমাকে ত্রুটিটি দেয়... has no method reverse
ক্যাটফিশ

@ গুগল ফিশ আপনি ঠিক বলেছেন, আমি ঠিক লক্ষ্য করেছি যে [মোঙ্গো-হ্যাকার] ( টাইলারব্রোক.github.com/mongo-hacker ) দ্বারা বিপরীত () যুক্ত হয়েছিল , আমি আমার উত্তর আপডেট করব। ধন্যবাদ।
ট্র্যাসপ্লাজিও গারজুগলিও

1
db.get Colલેક્શન ('COLLECTION_NAME')। সন্ধান করুন ()। এড়িয়ে যান (db.get Colલેક્શન ('COLLECTION_NAME')। গণনা () - এন) আমার পক্ষে দুর্দান্ত কাজ করছে :)
Spl2nky

এটি প্রশ্নের উত্তর হওয়া উচিত, এবং জাস্টিন জেনকিনসের উত্তর নয়।
Jadiel দে আরমাস

প্রাকৃতিক আদেশের উপর নির্ভর করা উচিত নয় ; আপনি যদি একটি প্রতিলিপি সেট ব্যবহার করছেন (এবং আপনার হওয়া উচিত), বিভিন্ন নোডের ডিস্কে অন্য ক্রমে একই ডকুমেন্টগুলি থাকতে পারে।
ভিন্স বোডরেন

14

সর্বশেষ এন রেকর্ড পেতে আপনি নীচের কোয়েরি কার্যকর করতে পারেন:

db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)

আপনি যদি কেবল একটি শেষ রেকর্ড চান:

db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})

দ্রষ্টব্য: প্রাকৃতিক জায়গায় আপনি আপনার সংগ্রহ থেকে কলামগুলির মধ্যে একটি ব্যবহার করতে পারেন।


এটি আমার জন্য কাজ করে db.yourcollectionname.findOne ($ $ ক্যোয়ারী: {}, $ অর্ডারবাই: {$ প্রাকৃতিক: -1}})। আমি মনে করি উত্তরের সর্বশেষ প্যারাথনসিসটি অনুপস্থিত
অজয়

প্রাকৃতিক আদেশের উপর নির্ভর করা উচিত নয় ; আপনি যদি একটি প্রতিলিপি সেট ব্যবহার করছেন (এবং আপনার হওয়া উচিত), বিভিন্ন নোডের ডিস্কে অন্য ক্রমে একই ডকুমেন্টগুলি থাকতে পারে।
ভিন্স বোডরেন

6

আপনি ব্যবহার করতে পারেন sort(), limit(), skip()কোনো এড়ানো হয়েছে মান থেকে গত এন রেকর্ড শুরু করতে

db.collections.find().sort(key:value).limit(int value).skip(some int value);

6

আপনি এই পদ্ধতিটি চেষ্টা করতে পারেন:

সংগ্রহের সাথে মোট রেকর্ডের সংখ্যা পান

db.dbcollection.count() 

তারপরে স্কিপ ব্যবহার করুন:

db.dbcollection.find().skip(db.dbcollection.count() - 1).pretty()

5

অনুসন্ধানের অধীনে দেখুন: বাছাই এবং প্রাকৃতিক আদেশ, http://www.mongodb.org/display/DOCS/ বাছাই +++ প্রাকৃতিক + অর্ডার পাশাপাশি কার্সার পদ্ধতিগুলির অধীনে বাছাই করুন () http://www.mongodb.org/display / ডক্স / উন্নত + + ক্যোয়ারী


1
আপনার অ্যাঞ্জারের জন্য ধন্যবাদ, এটি নিকটে, তবে আমি সাম্প্রতিককালের থেকে সাম্প্রতিকতম সময়ের জন্য অর্পিত রেকর্ডগুলি পুনরুদ্ধার করতে চাই, এটি কি সম্ভব?
বিন চেন

প্রাকৃতিক আদেশের উপর নির্ভর করা উচিত নয় ; আপনি যদি একটি প্রতিলিপি সেট ব্যবহার করছেন (এবং আপনার হওয়া উচিত), বিভিন্ন নোডের ডিস্কে অন্য ক্রমে একই ডকুমেন্টগুলি থাকতে পারে।
ভিন্স বোডরেন

আপনি যদি সর্বাধিক সাম্প্রতিক রেকর্ড পেতে চান তবে আপনাকে নথিতে একটি তারিখের ক্ষেত্রের উপর নির্ভর করতে হবে।
ভিন্স বোডরেন

5

আপনি সংগ্রহের আকারের উপর ভিত্তি করে "এড়িয়ে যেতে" পারবেন না, কারণ এটি ক্যোয়ারীর শর্তাদি বিবেচনায় নেবে না।

সঠিক সমাধানটি পছন্দসই শেষ-পয়েন্ট থেকে বাছাই করা, ফলাফলের আকারের সীমাবদ্ধ করা, তারপরে প্রয়োজনে ফলাফলের ক্রম সামঞ্জস্য করুন।

রিয়েল-ওয়ার্ল্ড কোডের উপর ভিত্তি করে এখানে একটি উদাহরণ দেওয়া আছে।

var query = collection.find( { conditions } ).sort({$natural : -1}).limit(N);

query.exec(function(err, results) {
    if (err) { 
    }
    else if (results.length == 0) {
    }
    else {
        results.reverse(); // put the results into the desired order
        results.forEach(function(result) {
            // do something with each result
        });
    }
});

চমৎকার কাজ! যদিও ক্যোয়ারী স্তরে একই কাজ করতে সক্ষম হতে পেরে ভাল লাগবে। কিছু একটা var query = collection.find( { conditions } ).sort({$natural : -1}).reverse().limit(N)
inwpitrust

4

@ বিন-চেন,

আপনি সংগ্রহের নথির একটি উপসেটের সর্বশেষ n এন্ট্রিগুলির জন্য একটি সংগ্রহ ব্যবহার করতে পারেন। এখানে দলবদ্ধকরণ ছাড়াই একটি সরল উদাহরণ রয়েছে (যা আপনি এই ক্ষেত্রে 4 থেকে 5 পর্যায়ের মধ্যে করছেন)।

এটি আরোহণের অনুসারে সাজানো সর্বশেষ 20 এন্ট্রি ("টাইমস্ট্যাম্প" নামক একটি ক্ষেত্রের উপর ভিত্তি করে) প্রদান করে। এরপরে এটি প্রতিটি নথি _আইডি, টাইমস্ট্যাম্প এবং যাই হোক না কেন_ফিল্ড_আপনি_বন্ত_তে_ ফলাফলগুলিতে দেখান।

var pipeline = [
        {
            "$match": { //stage 1: filter out a subset
                "first_field": "needs to have this value",
                "second_field": "needs to be this"
            }
        },
        {
            "$sort": { //stage 2: sort the remainder last-first
                "timestamp": -1
            }
        },
        {
            "$limit": 20 //stage 3: keep only 20 of the descending order subset
        },
        {
            "$sort": {
                "rt": 1 //stage 4: sort back to ascending order
            }
        },
        {
            "$project": { //stage 5: add any fields you want to show in your results
                "_id": 1,
                "timestamp" : 1,
                "whatever_field_you_want_to_show": 1
            }
        }
    ]

yourcollection.aggregate(pipeline, function resultCallBack(err, result) {
  // account for (err)
  // do something with (result)
}

সুতরাং, ফলাফলটি দেখতে এমন কিছু দেখাচ্ছে:

{ 
    "_id" : ObjectId("5ac5b878a1deg18asdafb060"),
    "timestamp" : "2018-04-05T05:47:37.045Z",
    "whatever_field_you_want_to_show" : -3.46000003814697
}
{ 
    "_id" : ObjectId("5ac5b878a1de1adsweafb05f"),
    "timestamp" : "2018-04-05T05:47:38.187Z",
    "whatever_field_you_want_to_show" : -4.13000011444092
}

আশাকরি এটা সাহায্য করবে.


1
আপনাকে @ লরি 108 ধন্যবাদ! এই এবং সম্পর্কিত প্রশ্নের সমস্ত উত্তরগুলির মধ্যে, "" কীভাবে "শেষ এন ডকস পেতে পারি" এর একমাত্র কার্যকরী এবং নির্ভরযোগ্য সমাধান। এবং একটি ক্যোয়ারিতে করতে যথেষ্ট সহজ। কাজ শেষ.
র্যান্ডমসক

@ র্যান্ডমসক যদি আপনার এটি পছন্দ হয় তবে তা ভোট দিন :)
লরি 108

4

আপনার সংগ্রহের আকারের উপর ভিত্তি করে বাছাই করা, এড়িয়ে যাওয়া ইত্যাদি pretty

আপনার যদি কিছু মানদণ্ড অনুসারে সংকলন সংগ্রহ করা থাকে তবে আরও ভাল পারফরম্যান্স অর্জন করা যেতে পারে; এবং তারপরে আপনি সর্বনিম্ন () কার্সারটি ব্যবহার করতে পারেন:

প্রথমে, সূচকগুলি যা দিয়ে আপনি সংগ্রহ করেন db.collectionName.setIndex( yourIndex ) আপনি আরোহী বা অবতরণ ক্রমটি ব্যবহার করতে পারেন যা দুর্দান্ত because ।

তারপরে আপনি আপনার সংগ্রহের প্রথম আইটেমটি সন্ধান করেন এবং এর সূচির ক্ষেত্রের মানগুলি সন্ধানে নূন্যতম মানদণ্ড হিসাবে ব্যবহার করুন:

db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)

কমপক্ষে () কার্সারের জন্য এখানে উল্লেখ রয়েছে: https://docs.mongodb.com/manual/references/method/cursor.min/


একমাত্র উত্তর যা কর্মক্ষমতা অ্যাকাউন্টে গ্রহণ করে, দুর্দান্ত সংযোজন :)
জারডিলিয়র

এই উত্তর অর্ডার গ্যারান্টি দেয়?
জারডিলিয়র

হ্যাঁ, এটি আপনার সূচকের উপর ভিত্তি করে গ্যারান্টি দেয়
জোও ওটারো

স্পষ্টতই আপনি কেবল মিনিটটি ভুলে যেতে পারেন এবং ব্যবহার করতে পারেন: db.collectionName.find().hint(yourIndex).limit(N) যদি সূচকটি অবতরণে থাকে তবে আপনি এন ন্যূনতম মান পাবেন।
হলটাক্স


0
db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n)

মঙ্গোডিবি ডকুমেন্টেশন অনুসারে :

আপনি কোয়েরিকে ফরওয়ার্ড সংগ্রহের স্ক্যান করতে বাধ্য করতে} $ প্রাকৃতিক: 1 specify নির্দিষ্ট করতে পারেন।

বিপরীত সংগ্রহের স্ক্যানটি করতে কোয়েরিকে বাধ্য করার জন্য আপনি {$ প্রাকৃতিক: -1 specify নির্দিষ্ট করতে পারেন।


0

অ্যারে উপাদানগুলিকে সীমাবদ্ধ করতে $ স্লাইস অপারেটর ব্যবহার করুন

GeoLocation.find({},{name: 1, geolocation:{$slice: -5}})
    .then((result) => {
      res.json(result);
    })
    .catch((err) => {
      res.status(500).json({ success: false, msg: `Something went wrong. ${err}` });
});

জিওলোকেশন ডেটা অ্যারে যেখানে, আমরা শেষ 5 রেকর্ড পেতে।


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