মঙ্গোদব সংগ্রহ থেকে সর্বশেষতম রেকর্ড পান


106

আমি একটি সংগ্রহে সবচেয়ে সাম্প্রতিক রেকর্ড জানতে চাই। কিভাবে যে কি?

দ্রষ্টব্য: আমি জানি যে নিম্নলিখিত কমান্ড লাইন প্রশ্নগুলি কাজ করে:

1. db.test.find().sort({"idate":-1}).limit(1).forEach(printjson);
2. db.test.find().skip(db.test.count()-1).forEach(printjson)

যেখানে আইডিতে টাইমস্ট্যাম্প যুক্ত হয়েছে।

সমস্যাটি দীর্ঘতর হ'ল সংগ্রহটি ডেটা ফেরত নেওয়ার সময় এবং আমার 'পরীক্ষা' সংগ্রহটি সত্যিই বিশাল। ধ্রুবক সময় প্রতিক্রিয়া সহ আমার একটি প্রশ্নের প্রয়োজন।

যদি আরও ভাল মংডোডব কমান্ড লাইন কোয়েরি থাকে তবে আমাকে জানান।

উত্তর:


143

এটি পূর্ববর্তী উত্তরের পুনঃস্থাপন তবে এটি বিভিন্ন মঙ্গোদব সংস্করণে কাজ করার সম্ভাবনা বেশি।

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

13
db.collection.find().limit(1).sort({$natural:-1}).pretty()যদি আপনি এটি দেখতে সুন্দর দেখতে চান
অ্যান্থনি

সুতরাং, এই আদেশের সাথে তফাত কী:db.collection.find().sort({$natural:-1}).limit(1).pretty()
লিও

@ ডিজিটগুলি যদি আপনার ফলাফলটি কেবলমাত্র একটি ডকুমেন্টের মধ্যে সীমাবদ্ধ করে রাখে এবং শেষ রেকর্ডটি কীভাবে পাওয়া যায় তবে শেষের রেকর্ডটি কীভাবে কার্যকর করা যায় তাতে তার পারফরম্যান্সের প্রভাব কী হবে তা সংগ্রহ করে এবং এটি অবশ্যই সংগ্রহের শীর্ষ নথি হতে পারে।
কৈলাস যোগেশ্বর

চমৎকার উত্তর. আমি ভালো চেষ্টা: db.collection ( "সংগ্রহে নামে") এটি ({}, {সীমা: 1}) সাজানোর ({$ প্রাকৃতিক:
আব্দুল আলীম সাকির

যে কেউ ব্যবহার ডেস্কটপ AWS DocDB: Query failed with error code 303 and error message 'option $natural is not supported' on server docdb। আশা করি শীঘ্রই সেই বৈশিষ্ট্যটি আসবে।
মার্ক

35

এটি আপনাকে একটির জন্য একটি শেষ নথি দেবে collection

db.collectionName.findOne({}, {sort:{$natural:-1}})

$natural:-1 মানে রেকর্ড inোকানো হয় তার বিপরীতে অর্ডার।

সম্পাদনা করুন : নীচে নেমে আসা সমস্ত জনগণের জন্য একটি মঙ্গুজ সিনট্যাক্স, মঙ্গো সিএলআই সিনট্যাক্সটি হ'ল:db.collectionName.find({}).sort({$natural:-1}).limit(1)


7
আপনার সিনট্যাক্সটি ভুল বলে মনে হচ্ছে। আপনার যেমন আছে তেমন কাজ করার জন্য আমি এটি পেতে পারি না। কাজটি কী: 'db.punchdeck.findOne ({$ ক্যোয়ারী: {}, $ অর্ডারবাই: {$ প্রাকৃতিক: -1}})'
ডেভ লোয়ার

নিশ্চিত নন, কেন সমস্ত নিম্নাঞ্চল - এই কোডটি আমার পক্ষে নিখুঁতভাবে কাজ করে এবং দ্রুত
অন্ধকার_রাবী

4
@dark_ruby আপনি ত্রুটিটি "$ ভুল" ফেরান: "ক্যোয়ারিকালাইজ করা ক্যোয়ারী করতে পারেন না: BadValue অসমর্থিত প্রক্ষেপণ বিকল্প: সাজান: {$ প্রাকৃতিক: -1.0}",
রোমান পোডলিনভ

19

ধ্রুবক সময় সাড়া সহ আমার একটি প্রশ্নের প্রয়োজন

ডিফল্টরূপে, মঙ্গোডিবিতে সূচিগুলি হ'ল বি-ট্রি। একটি বি-ট্রি অনুসন্ধান করা একটি ও (লগএন) অপারেশন, সুতরাং এমনকি find({_id:...})ধ্রুবক সময় সরবরাহ করে না, হে (1) প্রতিক্রিয়া।

এতে বলা হয়েছে, আপনি _idযদি ObjectIdআইডি ব্যবহার করছেন তবে আপনি এটি অনুসারে বাছাই করতে পারেন । বিশদ জন্য এখানে দেখুন । অবশ্যই, এটি কেবলমাত্র দ্বিতীয় দ্বিতীয়টির পক্ষে ভাল।

আপনি "দু'বার লেখার" অবলম্বন করতে পারেন। মূল সংগ্রহে একবার লিখুন এবং আবার একটি "সর্বশেষ আপডেট হওয়া" সংকলনে লিখুন। লেনদেন ছাড়াই এটি নিখুঁত হবে না, তবে "সর্বশেষ আপডেট হওয়া" সংগ্রহের মধ্যে একটি আইটেমের সাথে এটি সর্বদা দ্রুত হবে।


4
আমি অনেকগুলি এনএসকিউএল এবং মঙ্গোডিবি সমাধানগুলিকে "দুবার লেখার" জন্য পরামর্শ দিচ্ছি, বেশিরভাগ গণনাধারীদের জন্য যখন ডেটার আকার খুব বড় হয়ে যায়। আমি অনুমান করছি এটি একটি সাধারণ অভ্যাস?
Vinny

4
মঙ্গোডিবি খুব ঘন ঘন ডিস্কে ফ্লাশ করে না এবং এর কোনও লেনদেন হয় না, সুতরাং লেখাগুলি উল্লেখযোগ্যভাবে দ্রুত হয়ে যায়। এখানে বাণিজ্য বন্ধ হ'ল আপনি ডেটা-স্বাভাবিককরণের জন্য উত্সাহিত হন যা প্রায়শই একাধিক লেখার দিকে পরিচালিত করে। অবশ্যই, যদি আপনি 10x বা 100x রাইটিং থ্রুপুট পান (যা আমি দেখেছি), তবে 2x বা 3x রাইটস এখনও একটি বড় উন্নতি।
গেটস ভিপি

15

মংগোডিবি সংগ্রহ থেকে শেষ আইটেমটি পাওয়ার আরও একটি উপায় (উদাহরণগুলি সম্পর্কে মনে করবেন না):

> db.collection.find().sort({'_id':-1}).limit(1)

সাধারণ অভিক্ষেপ

> db.Sports.find()
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2017", "Body" : "Again, the Pats won the Super Bowl." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

সাজানো প্রজেকশন (_id: বিপরীত ক্রম)

> db.Sports.find().sort({'_id':-1})
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2018", "Body" : "Again, the Pats won the Super Bowl" }

sort({'_id':-1}), সমস্ত নথির এসের উপর ভিত্তি করে উত্থাপিত ক্রমে একটি প্রজেকশন সংজ্ঞায়িত করে _id

সাজানো প্রজেকশন (_ আইড: বিপরীত ক্রম): সংগ্রহ থেকে সর্বশেষ (শেষ) নথি পাওয়া যাচ্ছে।

> db.Sports.find().sort({'_id':-1}).limit(1)
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

2

পিএইচপি 7.1 মঙ্গোডিবি:
$data = $collection->findOne([],['sort' => ['_id' => -1],'projection' => ['_id' => 1]]);



1

"ফু" সংগ্রহ থেকে সমস্ত মঙ্গোডিবি নথি থেকে শেষ রেকর্ডটি কীভাবে পাওয়া যায় ((foo, x, y .. ইত্যাদি পরিবর্তন করুন)

db.foo.aggregate([{$sort:{ x : 1, date : 1 } },{$group: { _id: "$x" ,y: {$last:"$y"},yz: {$last:"$yz"},date: { $last : "$date" }}} ],{   allowDiskUse:true  })

আপনি গ্রুপটি থেকে যোগ বা সরাতে পারেন

সহায়তা নিবন্ধগুলি: https://docs.mongodb.com/manual/references/operator/aggregation/group/#pipe._S_group

https://docs.mongodb.com/manual/references/operator/aggregation/last/


0

আপনি যদি নিজের দস্তাবেজে স্বয়ংক্রিয়ভাবে উত্পাদিত মঙ্গো অবজেক্ট আইডি ব্যবহার করছেন তবে এটিতে প্রথম 4 বাইট হিসাবে টাইমস্ট্যাম্প রয়েছে যা সংগ্রহের মধ্যে সর্বশেষ ডকটি inোকানো হয়েছিল এটি ব্যবহার করে। আমি বুঝতে পারছি এটি একটি পুরানো প্রশ্ন, তবে কেউ যদি এখানে এখনও শেষ করে থাকেন তবে আরও একটি বিকল্প খুঁজছেন।

db.collectionName.aggregate(
[{$group: {_id: null, latestDocId: { $max: "$_id"}}}, {$project: {_id: 0, latestDocId: 1}}])

উপরে ক্যোয়ারী সংগ্রহের মধ্যে সন্নিবেশ করানো সর্বশেষ দস্তাবেজের জন্য _ID দেবে

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