2013-01-25 8 views
11

काम नहीं कर रहा है मैं पहले तारीख तक डेटा को सॉर्ट करने का प्रयास कर रहा हूं और फिर किसी अन्य फ़ील्ड पर समूह कर रहा हूं। यह मेरे लिए काम नहीं कर रहा है।मोंगो एग्रीगेशन फ्रेमवर्क, सॉर्ट करें और फिर समूह

मैं जिस प्रश्न का उत्तर देने का प्रयास कर रहा हूं वह है: सबसे हालिया विशिष्ट सिड का चयन करें?

दिया इस डेटा:

db.summary.save({"lid" : 5, "date" : 5, "cid" : 2, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 2, "date" : 2, "cid" : 1, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 4, "date" : 0, "cid" : 3, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 3, "date" : 3, "cid" : 2, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 1, "date" : 1, "cid" : 1, "circles" : [ 2 ] }) 

db.summary.aggregate({$match :{circles: 2}, $sort: {date: -1}, $group: {_id: '$cid'}}) 

मैं हलकों पर पहले एक मैच कर रहा हूँ, तो तारीख को एक तरह से, तो सीआईडी ​​

परिणाम मैं हो रही है पर एक समूह:

{ 
    "result" : [ 
     { 
      "_id" : 3 
     }, 
     { 
      "_id" : 1 
     }, 
     { 
      "_id" : 2 
     } 
    ], 
    "ok" : 1 
} 

यहां मेरा विश्लेषण है:

मिलान या दिनांक द्वारा छँटाई से पहले, डेटा था:

"lid" : 5, "date" : 5, "cid" : 2 
"lid" : 2, "date" : 2, "cid" : 1 
"lid" : 4, "date" : 0, "cid" : 3 
"lid" : 3, "date" : 3, "cid" : 2 
"lid" : 1, "date" : 1, "cid" : 1 

तिथि के अनुसार छँटाई करने के बाद, डेटा सेट होगा:

"lid" : 5, "date" : 5, "cid" : 2 
"lid" : 3, "date" : 3, "cid" : 2 
"lid" : 2, "date" : 2, "cid" : 1 
"lid" : 1, "date" : 1, "cid" : 1 
"lid" : 4, "date" : 0, "cid" : 3 

तो समूह के बाद, परिणाम मैं उम्मीद है:

{ 
    "result" : [ 
     { 
      "_id" : 2 
     }, 
     { 
      "_id" : 1 
     }, 
     { 
      "_id" : 3 
     } 
    ], 
    "ok" : 1 
} 

मेरी समस्या का समाधान किस प्रश्न से हल करता है?

वर्तमान क्वेरी क्यों मेरे लिए काम नहीं कर रही है?

+0

आपके पाइपलाइन पैरामीटर को 'कुल' करने के लिए या तो एक सरणी में रखा जाना चाहिए या एक बड़ी वस्तु के बजाय स्वतंत्र वस्तुओं के रूप में पारित किया जाना चाहिए। और आपका प्रश्न 'cid' पर समूहबद्ध करने के बारे में बात करता है लेकिन आदेश '$ date' पर समूहित हो रहा है। – JohnnyHK

+0

वह एक टाइपो था। यह $ समूह होना चाहिए: {_id: '$ cid'} – ben39

उत्तर

17

जब आप $group पाइपलाइन में $sort के बाद, पिछला प्रकार खो गया है। आप कुछ इस तरह कर दिया था बजाय ताकि तारीख आप क्रमित करना चाहते समूहीकरण के बाद उपलब्ध है:

db.summary.aggregate(
    {$match: {circles: 2}}, 
    {$group: {_id: '$cid', date: {$max: '$date'}}}, 
    {$sort: {date: -1}}); 

परिणाम:

[ { _id: 2, date: 5 }, 
    { _id: 1, date: 2 }, 
    { _id: 3, date: 0 } ] 

एक $project पाइप लाइन के अंत में जोड़ें अगर आप आउटपुट को दोबारा बदलना चाहते हैं।

+0

धन्यवाद! यही वही है जो मैं खोज रहा था, भले ही मैंने आपके द्वारा उत्तर दिए गए समय तक इसे पहले ही समझ लिया हो :) – ben39

+1

यह मत भूलना कि अगर आप $ समूह पर कुछ भी सॉर्ट करना चाहते हैं तो आपको इसे '_id' के साथ $ सॉर्ट में शामिल करना होगा ।तारीख'। जांचें http://stackoverflow.com/questions/21265170/mongodb-aggregation-sort-not-working – mwm

+2

"जब आप पाइपलाइन में $ $ सॉर्ट के बाद $ समूह करते हैं, तो पिछला प्रकार गुम हो जाता है।" यह वास्तव में सच नहीं है (संभवतः पुराना)। न केवल यह संभव है, लेकिन यह पसंदीदा तरीका है क्योंकि इस तरह से सॉर्ट इंडेक्स का उपयोग कर सकते हैं: https://docs.mongodb.com/manual/reference/operator/aggregation/sort/#sort-operator-and-performance – slouc

संबंधित मुद्दे