2015-06-08 7 views
9

यहाँ में _ id की क्या ज़रूरत है MongoDB ट्यूटोरियल (से एक उदाहरण है यहां यह संग्रह ZIP Code db:MongoDB - ऑब्जेक्ट्स? मैं क्यों कुल

db.zipcodes.aggregate([ 
    { $group: { _id: "$state", totalPop: { $sum: "$pop" } } }, 
    { $match: { totalPop: { $gte: 10*1000*1000 } } } 
]) 

अगर मैं शब्द Test की तरह कुछ और के साथ _id की जगह, मैं त्रुटि संदेश प्राप्त होगा:

"errmsg" : "exception: the group aggregate field 'Test' must be defined as an expression inside an object", 
"code" : 15951, 
"ok" : 0 

किसी को भी मदद कर सकता है मुझे समझने क्यों मैं अपने आदेश में _id की ज़रूरत है? मैंने सोचा था कि MongoDB आईडी स्वचालित रूप से प्रदान करती है, यदि उनका उपयोग यह प्रदान नहीं करता है।

उत्तर

5

$group चरण में, _id समूह की स्थिति को निर्दिष्ट करने के लिए उपयोग किया जाता है। आपको स्पष्ट रूप से इसकी आवश्यकता है।

यदि आप SQL दुनिया से परिचित हैं, तो इसे GROUP BY खंड के रूप में सोचें।


कृपया ध्यान दें, इस संदर्भ भी में, _id वास्तव में, उत्पन्न संग्रह में एक अद्वितीय पहचानकर्ता है परिभाषा $group द्वारा के रूप में है कि क्षेत्र के लिए समान मान होने दो दस्तावेज पेश नहीं कर सकते।

+0

एसक्यूएल में मैं द्वारा समूह है और मैं $ राज्य द्वारा समूह के लिए क्षेत्र है, _ id किसी भी एसक्यूएल अनुरूप तरह नहीं दिखता है। – user1700890

3

_id फील्ड अनिवार्य है, लेकिन आप null के लिए सेट कर सकते हैं यदि आप एक प्रमुख, या कुंजी के संबंध में एकत्र करने के लिए इच्छा नहीं है। इसका उपयोग न करने के परिणामस्वरूप खेतों में एक कुल मूल्य होगा। इस प्रकार इस संदर्भ में 'आरक्षित शब्द' कार्य कर रहा है, यह दर्शाता है कि परिणामस्वरूप 'पहचानकर्ता'/कुंजी प्रत्येक समूह के लिए क्या है।

आपके मामले में, _id: "$state" द्वारा समूह में वहाँ प्रदान की totalPop की n समस्त परिणाम, परिणाम होगा state (SELECT SUM() FROM table GROUP BY state के लिए समान) के लिए n अलग-अलग मान रहे हैं। जबकि,

$group : {_id : null, totalPop: { $sum: "$pop" }}} 

totalPop के लिए एक एकल परिणाम (SELECT SUM() FROM table के लिए समान) प्रदान करेगा।

यह व्यवहार समूह ऑपरेटर documentation में अच्छी तरह वर्णित है।

5

हम समूह एकत्रीकरण चरणों में _id रों के निर्माण के लिए कुछ सर्वोत्तम प्रथाओं को $group चरण & नज़र भीतर _id क्षेत्र को समझने के लिए जा रहे हैं। के इस क्वेरी पर नजर डालते हैं:


db.companies.aggregate([{ 
    $match: { 
    founded_year: { 
     $gte: 2010 
    } 
    } 
}, { 
    $group: { 
    _id: { 
     founded_year: "$founded_year" 
    }, 
    companies: { 
     $push: "$name" 
    } 
    } 
}, { 
    $sort: { 
    "_id.founded_year": 1 
    } 
}]).pretty() 

MongoDB $group with document approach

एक बात जो हमारे लिए स्पष्ट नहीं हो सकता है कर रहा है क्यों _id क्षेत्र इस "दस्तावेज़" जिस तरह से निर्माण किया है? हम इसे इस तरह से किया जा सकता था है और साथ ही:


db.companies.aggregate([{ 
    $match: { 
    founded_year: { 
     $gte: 2010 
    } 
    } 
}, { 
    $group: { 
    _id: "$founded_year", 
    companies: { 
     $push: "$name" 
    } 
    } 
}, { 
    $sort: { 
    "_id": 1 
    } 
}]).pretty()

MongoDB $group without document approach

हम क्योंकि ये उत्पादन दस्तावेजों में यह इस तरह से नहीं करते हैं, - यह वास्तव में क्या मतलब है इस संख्या स्पष्ट नहीं है। तो, हम वास्तव में नहीं जानते हैं। और कुछ मामलों में, इसका मतलब है कि इन दस्तावेजों को समझने में शायद भ्रम हो सकता है।तो, एक अन्य मामले समूह के लिए हो सकता है कई क्षेत्रों के साथ एक _id दस्तावेज़:


db.companies.aggregate([{ 
    $match: { 
    founded_year: { 
     $gte: 2010 
    } 
    } 
}, { 
    $group: { 
    _id: { 
     founded_year: "$founded_year", 
     category_code: "$category_code" 
    }, 
    companies: { 
     $push: "$name" 
    } 
    } 
}, { 
    $sort: { 
    "_id.founded_year": 1 
    } 
}]).pretty() 

group an _id document with multiple fields in MongoDB

$push बस पैदा सरणियों के तत्वों को धक्का। अक्सर, यह ऊपरी स्तर पर पदोन्नत खेतों पर समूह के लिए आवश्यक हो सकता है:


db.companies.aggregate([{ 
    $group: { 
    _id: { 
     ipo_year: "$ipo.pub_year" 
    }, 
    companies: { 
     $push: "$name" 
    } 
    } 
}, { 
    $sort: { 
    "_id.ipo_year": 1 
    } 
}]).pretty()

group on promoted fields to upper level in MongoDB

यह भी एक अभिव्यक्ति है कि एक _id कुंजी के रूप में एक दस्तावेज पर ले कर जाता है करने के लिए एकदम सही है।

db.companies.aggregate([{ 
    $match: { 
    "relationships.person": { 
     $ne: null 
    } 
    } 
}, { 
    $project: { 
    relationships: 1, 
    _id: 0 
    } 
}, { 
    $unwind: "$relationships" 
}, { 
    $group: { 
    _id: "$relationships.person", 
    count: { 
     $sum: 1 
    } 
    } 
}, { 
    $sort: { 
    count: -1 
    } 
}])

It's also perfect to have an expression that resolves to a document as a _id key in MongoDB

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