2012-09-14 15 views
12

मैं ऑब्जेक्ट्स के नेस्टेड सरणी को सॉर्ट करने का एक तरीका ढूंढ रहा हूं। मैं यह कैसे पूरा कर सकते हैं अब मान लो मैं answers सरणी के सभी name को खोजने के लिए, चाहते हैं, लेकिन आरोह क्रम में यह छँटाईMongoDB: ऑब्जेक्ट्स की नेस्टेड सरणी क्रमबद्ध करें

answers: [ 
      {name: 'paul', state: 'RU'}, 
      {name: 'steve', state: 'US'}, 
      {name: 'mike', state: 'DE'}, 
      ... 
     ] 

,: यहाँ एक उदाहरण है?

उत्तर

23

मैं इसे उस क्रम में संग्रहीत करूंगा जिसे आप इसे वापस चाहते हैं। या इसे क्लाइंट साइड पर खींचने के बाद इसे सॉर्ट करें।

उन लोगों में से कोई भी संभव नहीं हैं, तो आप उपयोग कर सकते हैं aggregation framework:

> db.test.insert({answers: [ 
...     {name: 'paul', state: 'RU'}, 
...     {name: 'steve', state: 'US'}, 
...     {name: 'mike', state: 'DE'}]}); 
> db.test.insert({answers: [ 
...     {name: 'paul', state: 'RU'}, 
...     {name: 'steve', state: 'US'}, 
...     {name: 'xavier', state: 'TX'}]}); 

db.test.aggregate([ 
    {$unwind: "$answers"}, 
    {$sort: {"answers.name":1}}, 
    {$group: {_id:"$_id", answers: {$push:"$answers"}}} 
]); 

पैदा करता है: एक खोज प्रदर्शन करने के बाद

{ 
    "result" : [ 
    { 
    "_id" : ObjectId("5053b2477d820880c3469364"), 
    "answers" : [ 
     { 
     "name" : "paul", 
     "state" : "RU" 
     }, 
     { 
     "name" : "steve", 
     "state" : "US" 
     }, 
     { 
     "name" : "xavier", 
     "state" : "TX" 
     } 
    ] 
    }, 
    { 
    "_id" : ObjectId("5053af9f7d820880c3469363"), 
    "answers" : [ 
     { 
     "name" : "mike", 
     "state" : "DE" 
     }, 
     { 
     "name" : "paul", 
     "state" : "RU" 
     }, 
     { 
     "name" : "steve", 
     "state" : "US" 
     } 
    ] 
    } 
], 
    "ok" : 1 
} 
-2

() आप वापसी मान पर तरह() का उपयोग कर सकते हैं।

db.collection.find({},{"answers.name":1}).sort({"answers.name":1}) 

खोज संग्रह में सभी दस्तावेज़ों के नाम फ़ील्ड निकालेगा। क्रमशः उन्हें नाम से आरोही क्रमबद्ध करेंगे।

http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

+1

आपको अपने 'answer.name' 'कुंजी के चारों ओर उद्धरण चाहिए। लेकिन मुझे नहीं लगता कि आपका कोड वह करता है जो वह ढूंढ रहा है ... –

+4

आपका उदाहरण सभी दस्तावेजों को उनके '_id' फ़ील्ड और' name' सरणी के साथ सूचीबद्ध करेगा, जो प्रत्येक सरणी में पहले नाम से क्रमबद्ध है। 'Sort()' दस्तावेज़ स्तर पर काम करता है और दस्तावेजों के भीतर सरणी को पुन: व्यवस्थित नहीं करता है। – Stennie

4

यह इस संदर्भ में मददगार नहीं हो सकता है, लेकिन मैंने सोचा कि मैं इस ऐड चाहते हैं। आपके पास उस लेखन पर सॉर्ट करने का विकल्प भी है जो denormalized संग्रहों के लिए बेहतर होता है जहां आपको एक से अधिक तरीकों से सॉर्ट करने की आवश्यकता नहीं होती है।

मुझे उपयोगकर्ता पर फ़ीड बनाने के दौरान मेरे ऐप में यह स्थिति मिली।

Meteor.users.helpers({ 
    'addToFeed': function (gameId, pushData) { 
    check(pushData, FeedSchema); 
    Meteor.users.update({ 
     _id: this._id, 
     "games.gameId": gameId 
    }, { 
     $push: { 
     "games.$.feed": { 
      $each: [pushData], 
      $sort: { timestamp: -1 } 
     } 
     } 
    }); 
    } 
}); 

मैं यह बहुत आसान हो सकता है क्योंकि आप तो find() उपयोग कर सकते हैं मिल गया है और यह डिफ़ॉल्ट रूप से आपके विनिर्देशों के अनुसार क्रमबद्ध किया जाएगा।

+0

मुझे $ min नामित फ़ील्ड सेट करने में सक्षम नहीं होने के बारे में एक minimongo त्रुटि मिल रही है ... कोई विचार? मुझे लगता है कि यह वास्तव में मेरे इच्छित चीज़ों के करीब है – lol

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