2011-03-15 17 views
18

मैं दस्तावेजों को क्रमबद्ध क्रम में वापस करना चाहता हूं जिसके द्वारा निम्नतम foo.bar मान (जो सरणी वस्तुएं हैं) हैं।मोंगोडब: सरणी ऑब्जेक्ट्स द्वारा क्रमबद्ध दस्तावेज़

मैं db.collection.find().sort({foo.0.bar: 1}) कर सकता हूं, लेकिन यह केवल सरणी में पहले तत्व से मेल खाता है - और जैसा कि आप नीचे दिए गए परीक्षा में देख सकते हैं आइटम 1 पहले (foo.0.bar = 5), wheras मैं वापस लौटने की तलाश में हूं आइटम 2 पहले (foo.2.bar = 4) क्योंकि इसमें ऑब्जेक्ट सबसे कम मूल्य वाला है।

{ 
    "name": "Item 1", 
    "foo": [ 
     { 
      "bar": 5 
     }, 
     { 
      "bar": 6 
     }, 
     { 
      "bar": 7 
     } 
    ] 
} 
{ 
    "name": "item 2", 
    "foo": [ 
     { 
      "bar": 6 
     }, 
     { 
      "bar": 5 
     }, 
     { 
      "bar": 4 
     } 
    ] 
} 
+0

db.collection.find() प्रकार ({foo.bar: 1})। – Troglo

उत्तर

0

मोंगो में ऐसा करने का कोई सीधा तरीका नहीं है। आपको प्रत्येक सरणी में न्यूनतम वैल को पुनः प्राप्त करने के लिए मानचित्र/कम करने की आवश्यकता होगी और उसके बाद उस न्यूनतम मान

+0

धन्यवाद। लेकिन उदाहरण में मानचित्र/कमी समारोह कैसा दिखता है? –

4

मानचित्र/कम करने का विकल्प, एक अलग फ़ील्ड के रूप में सरणी से न्यूनतम मान को स्टोर करना है वह दस्तावेज जिसे आप ऑर्डर कर सकते थे। जब आप सरणी में जोड़ते हैं, तो आप इस फ़ील्ड को भी अपडेट करते हैं यदि नया मान वर्तमान में रिकॉर्ड किए गए न्यूनतम से कम है।

उदा। अपना पहला दस्तावेज़ इस (नोट "Minbar कहा,") बन गयी:

{ 
    "name": "Item 1", 
    "minbar" : 5, 
    "foo": [ 
     { 
      "bar": 5, 
     } 
     { 
      "bar": 6, 
     } 
     { 
      "bar": 7, 
     } 
    ] 
} 
+0

यह एक अच्छा विचार है - और इस विशिष्ट उदाहरण में अच्छी तरह से काम करेगा। लेकिन एक और जटिल स्कीमा पर जहां इसे एकाधिक सरणी (यानी मेरी असली दुनिया स्कीमा) के लिए किया जाना चाहिए, यह थोड़ा गन्दा हो जाएगा। –

19

ऐसा लगता है मोंगो ऐसा कर सकते हैं।

उदाहरण के लिए, अगर मैं निम्नलिखित दस्तावेज है:

{ a:{ b:[ {c:1}, {c:5 } ] } } 
{ a:{ b:[ {c:0}, {c:12} ] } } 
{ a:{ b:[ {c:4}, {c:3 } ] } } 
{ a:{ b:[ {c:1}, {c:9 } ] } } 

और चलाने के निम्नलिखित:

db.collection.find({}).sort({ "a.b.c":1 }); 
// produces: 
{ a:{ b:[ {c:0}, {c:12} ] } } 
{ a:{ b:[ {c:1}, {c:5 } ] } } 
{ a:{ b:[ {c:1}, {c:9 } ] } } 
{ a:{ b:[ {c:4}, {c:3 } ] } } 

db.collection.find({}).sort({ "a.b.c":-1 }); 
// produces: 
{ a:{ b:[ {c:0}, {c:12} ] } } 
{ a:{ b:[ {c:1}, {c:9 } ] } } 
{ a:{ b:[ {c:1}, {c:5 } ] } } 
{ a:{ b:[ {c:4}, {c:3 } ] } } 

आप देख सकते हैं, तरह {"a.b.c":1} द्वारा मिनट सभी मानों का लेता है उस पर सरणी और प्रकार में, जबकि {"a.b.c":-1} द्वारा क्रमबद्ध सभी मूल्यों के अधिकतम लेते हैं।

+1

आपके दोनों आउटपुट एक ही परिणाम का उत्पादन कर रहे हैं। क्या वो सही है? – Raman

+4

आपको बारीकी से देखना होगा। पहला परिणाम 0, 1, 1, 3 के रूप में है। दूसरा 12,9,5,4 अवरोही है। – rompetroll

4

आप मोंगो संस्करण 2.2 से कुल कमांड के साथ इस तरह के एक तरह से कर सकते हैं:

db.collection.aggregate([{$unwind: "$foo"}, 
    {$project: {bars:"$foo.bar"}}, 
    {$group: {_id:"$_id",min:{$min: "$bars"}}}, 
    {$sort: {min:1}}]) 
+0

आपके उदाहरण के लिए धन्यवाद! – Vor

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