सरल .find().sort().skip().limit() को एग्रीगेशन फ्रेमवर्क में माइग्रेट करते समय मुझे समस्याओं का सामना करना पड़ा, जिसके परिणामस्वरूप टूटी हुई पेजिंग हुई: एक ही दस्तावेज़ कई पृष्ठों पर दिखाई दिया। अंत में, मैंने महसूस किया कि $limit, $sort के परिणामों के क्रम को प्रभावित करता है। नीचे मैं वर्णन कर रहा हूं कि समस्या को देखने के लिए चरणों को कैसे पुन: पेश किया जाए (मोंगो 3.4.17 और 3.6.7 पर चेक किया गया)।

> // 1. Create a simple coleection and fill it with test data: 
> for(var i = 0; i < 10; ++i) db.SomeCollection.insert({sortField: "just_some_string"});
> db.SomeCollection.count();
10
>
> // 2. Check, that with .find().sort().limit() the order of results does not depend on the `limit()`'s value:
db.SomeCollection.find().sort({"sortField": 1}).limit(5)
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb531"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb532"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb533"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb534"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb535"), "sortField" : "just_some_string" }
> db.SomeCollection.find().sort({"sortField": 1}).limit(8)
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb531"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb532"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb533"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb534"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb535"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb536"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb537"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb538"), "sortField" : "just_some_string" }
>
> // 3. Logically the same query but using Aggregation Framework
> db.SomeCollection.aggregate([{$sort: {"sortField": 1}}, {$limit: 5}]);
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb534"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb535"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb532"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb531"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb533"), "sortField" : "just_some_string" }
> db.SomeCollection.aggregate([{$sort: {"sortField": 1}}, {$limit: 8}]);
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb538"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb535"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb532"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb534"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb536"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb531"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb533"), "sortField" : "just_some_string" }
{ "_id" : ObjectId("5ba3ddf3a07260b77dddb537"), "sortField" : "just_some_string" }

मेरे प्रश्न हैं:

  1. .aggregate() के साथ $sort और उसके बाद $limit .find().sort().limit() की तुलना में परिणामों का भिन्न क्रम क्यों देता है?
  2. .aggregate() में परिणामों का क्रम $limit के मान पर क्यों निर्भर करता है?
0
Ivan Alikin 20 सितंबर 2018, 21:25

1 उत्तर

सबसे बढ़िया उत्तर

उन सभी दस्तावेज़ों का समान sortField मान है, इसलिए आदेश नियतात्मक नहीं है। सुसंगत परिणामों की गारंटी के लिए _id पर द्वितीयक प्रकार जोड़ें।

db.SomeCollection.aggregate([{$sort: {"sortField": 1, _id: 1}}, {$limit: 5}]);
2
JohnnyHK 21 सितंबर 2018, 16:42