2011-02-23 11 views
20

मैं mongoDB का उपयोग कर रहा हूं जिसमें मेरे पास निम्न प्रारूप का संग्रह है।mongodb विशिष्ट रिकॉर्ड प्राप्त करें

{"id" : 1 , name : x ttm : 23 , val : 5 } 
{"id" : 1 , name : x ttm : 34 , val : 1 } 
{"id" : 1 , name : x ttm : 24 , val : 2 } 
{"id" : 2 , name : x ttm : 56 , val : 3 } 
{"id" : 2 , name : x ttm : 76 , val : 3 } 
{"id" : 3 , name : x ttm : 54 , val : 7 } 

कि संग्रह मैं इस तरह अवरोही क्रम में रिकॉर्ड प्राप्त करने के लिए पूछे है पर:

db.foo.find({"id" : {"$in" : [1,2,3]}}).sort(ttm : -1).limit(3) 

लेकिन यह एक ही id = 1 के दो रिकॉर्ड देता है और मैं रिकॉर्ड चाहते हैं ऐसी है कि वह id प्रति 1 रिकॉर्ड देता है।

क्या यह मोंगोडब में संभव है?

उत्तर

25

मोंगोडब में distinct कमांड है, जिसका उपयोग एक क्वेरी के साथ किया जा सकता है। हालांकि, मेरा मानना ​​है कि यह आपके द्वारा निर्दिष्ट विशिष्ट कुंजी के लिए मूल्यों की एक अलग सूची देता है (यानी आपके मामले में, आपको केवल आईडी मान वापस आ जाएंगे) इसलिए मुझे यकीन नहीं है कि यह आपको वही देगा जो आप चाहते हैं पूरे दस्तावेज़ों की आवश्यकता है - इसके बजाय आपको MapReduce की आवश्यकता हो सकती है। अलग पर

प्रलेखन: http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct

+0

धन्यवाद, हाँ, मुझे पूरा दस्तावेज चाहिए लेकिन कोई डुप्लिकेट आईडी दस्तावेज़ –

+0

'विशिष्ट (: आईडी)' डुप्लिकेट आईडी के बिना पूरे दस्तावेज़ लौटाता है। – Voldy

+1

@ वोल्डी - मुझे मोंगो शैल में काम करने के लिए वह वाक्यविन्यास नहीं मिल सकता है, मुझे एक वाक्यविन्यास त्रुटि देता है? – AdaTheDev

6

मुद्दा यह है कि आप कैसे मिलान परिणामों के बीच चयन करने के लिए क्वेरी में और कोई तर्क प्रदान किए बिना 3 मिलान रिकॉर्ड एक करने के लिए नीचे शुद्ध करने के लिए चाहते हैं।

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

querymongo.com आपके लिए इन विशिष्ट प्रश्नों (एसक्यूएल से मोंगोडीबी) का अनुवाद करने का अच्छा काम करता है।

उदाहरण के लिए, इस एसक्यूएल:

SELECT DISTINCT columnA FROM collection WHERE columnA > 5 

इस MongoDB के रूप में दिया जाता है:

db.runCommand({ 
    "distinct": "collection", 
    "query": { 
     "columnA": { 
      "$gt": 5 
     } 
    }, 
    "key": "columnA" 
}); 
2

आप जावास्क्रिप्ट का उपयोग कर एक फाइल में अलग परिणाम लिखने के लिए चाहते हैं ... यह कैसे आप है

cursor = db.myColl.find({'fieldName':'fieldValue'}) 

var Arr = new Array(); 
var count = 0; 

cursor.forEach(

function(x) { 

    var temp = x.id;  
var index = Arr.indexOf(temp);  
if(index==-1) 
    { 
    printjson(x.id); 
    Arr[count] = temp; 
     count++; 
    } 
}) 
4

करना मेरा मानना ​​है कि आप इस

0 की तरह कुल उपयोग कर सकते हैं
collection.aggregate({ 
    $group : { 
     "_id" : "$id", 
     "docs" : { 
      $first : { 
      "name" : "$name", 
      "ttm" : "$ttm", 
      "val" : "$val", 
      } 
     } 
    } 
}); 
11

आप एकत्रीकरण का उपयोग करना चाहते हैं। तुम कर सकते हो कि इस तरह:

db.test.aggregate([ 
    // each Object is an aggregation. 
    { 
     $group: { 
      originalId: {$first: '$_id'}, // Hold onto original ID. 
      _id: '$id', // Set the unique identifier 
      val: {$first: '$val'}, 
      name: {$first: '$name'}, 
      ttm: {$first: '$ttm'} 
     } 

    }, { 
     // this receives the output from the first aggregation. 
     // So the (originally) non-unique 'id' field is now 
     // present as the _id field. We want to rename it. 
     $project:{ 
      _id : '$originalId', // Restore original ID. 

      id : '$_id', // 
      val : '$val', 
      name: '$name', 
      ttm : '$ttm' 
     } 
    } 
]) 

यह ... ~ 100,000 दस्तावेजों के अपने परीक्षण DB के लिए 90ms हो जाएगा बहुत तेजी से।

उदाहरण:

db.test.find() 
// { "_id" : ObjectId("55fb595b241fee91ac4cd881"), "id" : 1, "name" : "x", "ttm" : 23, "val" : 5 } 
// { "_id" : ObjectId("55fb596d241fee91ac4cd882"), "id" : 1, "name" : "x", "ttm" : 34, "val" : 1 } 
// { "_id" : ObjectId("55fb59c8241fee91ac4cd883"), "id" : 1, "name" : "x", "ttm" : 24, "val" : 2 } 
// { "_id" : ObjectId("55fb59d9241fee91ac4cd884"), "id" : 2, "name" : "x", "ttm" : 56, "val" : 3 } 
// { "_id" : ObjectId("55fb59e7241fee91ac4cd885"), "id" : 2, "name" : "x", "ttm" : 76, "val" : 3 } 
// { "_id" : ObjectId("55fb59f9241fee91ac4cd886"), "id" : 3, "name" : "x", "ttm" : 54, "val" : 7 } 


db.test.aggregate(/* from first code snippet */) 

// output 
{ 
    "result" : [ 
     { 
      "_id" : ObjectId("55fb59f9241fee91ac4cd886"), 
      "val" : 7, 
      "name" : "x", 
      "ttm" : 54, 
      "id" : 3 
     }, 
     { 
      "_id" : ObjectId("55fb59d9241fee91ac4cd884"), 
      "val" : 3, 
      "name" : "x", 
      "ttm" : 56, 
      "id" : 2 
     }, 
     { 
      "_id" : ObjectId("55fb595b241fee91ac4cd881"), 
      "val" : 5, 
      "name" : "x", 
      "ttm" : 23, 
      "id" : 1 
     } 
    ], 
    "ok" : 1 
} 

पेशेवरों: लगभग पूर्ण रूप से सबसे तेजी से विधि।

CONS: जटिल एकत्रीकरण API का उपयोग शामिल है। साथ ही, यह कड़ाई से दस्तावेज़ की मूल स्कीमा के साथ मिलकर है। हालांकि, इसे सामान्य बनाना संभव हो सकता है।

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