2016-07-07 7 views
5

मैं क्या है:जुटना सरणी तत्वों

{ "_id" : ObjectId("577dc9d61a0b7e0a40499f90"), "equ" : 123456, "key" : "p" } 
{ "_id" : ObjectId("577c789b1a0b7e0a403f1b52"), "equ" : 123456, "key" : "r" } 
{ "_id" : ObjectId("577b27481a0b7e0a4033965a"), "equ" : 123456, "key" : "r" } 
{ "_id" : ObjectId("5779d6111a0b7e0a40282dc7"), "equ" : 123456, "key" : "o" } 

मुझे क्या करना चाहते हैं:

{ "_id" : ObjectId("5779d6111a0b7e0a40282dc7"), "equ" : 123456, "keys" : "prro" } 

मैं क्या करने की कोशिश की:

db.table.aggregate([{"$group":{"_id":0, "keys":{"$push":"$key"}}}]) एक एआर देता है एई और स्ट्रिंग नहीं:

{"_id":0, "keys":["p","r","r","o"]} 

क्या आपके पास कोई विचार है?

+0

क्यों आप 'ObjectId (" 5779d6111a0b7e0a40282dc7 ") चुनें '? चूंकि यह आखिरी है? –

+0

ऑब्जेक्ट आईडी को खाते में न लें। मुझे आईडी के बारे में परवाह नहीं है, केवल इक्विटी और चाबियाँ मायने रखती हैं। – hotips

+1

फिर अंतिम आईडी को बनाए रखने की आवश्यकता नहीं है और फिर इसे प्रक्षेपित करने की आवश्यकता नहीं है, जैसा कि मैंने अपने उत्तर में किया था –

उत्तर

9

टीएल; डॉ इस एकत्रीकरण पाइपलाइन

उपयोग:

db.col.aggregate([ 
    {$group: {_id: "$equ", last: {$last: "$_id"}, keys: {$push: "$key"}}}, 
    { 
     $project: { 
      equ: "$_id", 
      _id: "$last", 
      keys: { 
       $reduce: { 
        input: "$keys", 
        initialValue: "", 
        in: {$concat: ["$$value", "$$this"]} 
       } 
      } 
     } 
    } 
]) 

अधिक जानकारी

सबसे पहले आपको चाहिए equ मूल्य के आधार पर दस्तावेजों group और भी last group member की _id के साथ एक array of keys बनाए रखने:

var groupByEqu = { 
    $group: { 
     _id: "$equ", 
     last: {$last: "$_id"}, 
     keys: {$push: "$key"} 
    } 
} 

बस को लागू करने के लिए इस पाइपलाइन आपरेशन परिणाम होगा में:

{ 
    "_id" : 123456, 
    "last" : ObjectId("5779d6111a0b7e0a40282dc7"), 
    "keys" : [ "p", "r", "r", "o" ] 
} 

आप एक प्रक्षेपण का उपयोग करना चाहिए अपने वांछित एक में पूर्ववर्ती दस्तावेज़ को बदलने के लिए। पहले दो परिवर्तन छोटे हैं। सरणी तत्वों में शामिल होने के लिए आप नई $reduce ऑपरेटर का उपयोग कर सकते हैं:

var project = { 
    $project: { 
     equ: "$_id", 
     _id: "$last", 
     keys: { 
      $reduce: { 
       input: "$keys", 
       initialValue: "", 
       in: {$concat: ["$$value", "$$this"]} 
      } 
     } 
    } 
} 

इन दो पाइप लाइन संचालन को लागू करने आप इच्छित परिणाम देना होगा:

db.col.aggregate([groupByEqu, project]) 

कौन सा है:

{ 
    "equ" : 123456, 
    "_id" : ObjectId("5779d6111a0b7e0a40282dc7"), 
    "keys" : "prro" 
} 
संबंधित मुद्दे