2013-12-10 5 views
10

कुछ नए फ़ील्ड निर्दिष्ट करने के लिए, मोंगोडीबी प्रोजेक्शन में एक तरीका है (लेकिन साथ ही, उन क्षेत्रों को बनाए रखें जो पाइपलाइन के प्रोजेक्शन चरण में इनपुट थे)? मैं मौजूदा क्षेत्रों में से किसी का नाम बदल नहीं रहा हूं।

तो अगर मैं एक संग्रह है कि 'फ़ील्ड 1' और 'field2' के साथ शुरू, और निम्न प्रक्षेपण कार्य करें:

{ $project: { field3: { $gt: ['$field1', 10] } } } 

मैं 'फ़ील्ड 1', 'field2' के साथ खत्म करना चाहते हैं, और ' field3 'अगले चरण में इनपुट के रूप में मौजूद है, या समेकन ढांचे से आउटपुट।

मैंने _id को छोड़कर बहिष्करण मोड में प्रक्षेपण करने का प्रयास किया, लेकिन यह काम नहीं करता है।

+2

यह प्रश्न कुछ उपयोगी (अलग) उत्तरों के साथ http://stackoverflow.com/questions/19431773/mongodb-aggregation-project-include-all-fields-plus-new-one पर भी उठाया गया है। –

उत्तर

1

केवल _id डिफ़ॉल्ट रूप से अनुमानित किया जाएगा। आपको यह निर्दिष्ट करना होगा कि अन्य क्षेत्रों को किस प्रकार पेश किया जाना है। इसके कारण वर्तमान पाइपलाइन चरण में कार्रवाई की जा रही पूर्ण दस्तावेज शामिल होंगे ताकि आप डॉन ':

{ $project: { field1:1,field2:1, field3: { $gt: ['$field1', 10] } } } 

या

{ $project: { field1:'$field1',field2:'$field2', field3: { $gt: ['$field1', 10] } } } 
+1

यह काम करता है अगर मैं उन सभी क्षेत्रों को जानता हूं जो प्रक्षेपण के इनपुट के रूप में मौजूद हैं। चूंकि यह स्वचालित पीढ़ी की प्रक्रिया का हिस्सा है, यह किसी भी प्रक्षेपण से पहले कौन से फ़ील्ड उपलब्ध हैं, इसका ट्रैक रखने के लिए यह मुश्किल है (असंभव नहीं, लेकिन आदर्श नहीं)। मैं ऐसे समाधान की तलाश में हूं जो स्वचालित रूप से उन मौजूदा फ़ील्ड को (लेकिन यह अस्तित्व में न हो) - बस यह पूछने पर पूछें)। – BraedenP

+0

'_id फ़ील्ड हमेशा डिफ़ॉल्ट रूप से शामिल होता है। Http://docs.mongodb.org/manual/reference/operator/aggregation/project/ में कथन का उल्लेख है कि शेष डिफ़ॉल्ट रूप से अनुमानित नहीं होंगे। – 4J41

9

MongoDB 2.6 एक नया $$ROOT एकत्रीकरण चर जो लगभग पड़ता कि आप क्या चाहते हैं की शुरुआत की टी को जानने या निर्दिष्ट करने की आवश्यकता है कि कौन से फ़ील्ड शामिल हैं।

अपने उदाहरण एकत्रीकरण ले रहा है और $$ROOT के साथ एक fields प्रक्षेपण जोड़ने:

{ 
    "_id" : ObjectId("53b56cc542974939144cee2a"), 
    "field3" : false, 
    "fields" : { 
     "_id" : ObjectId("53b56cc542974939144cee2a"), 
     "field1" : 1, 
     "field2" : 2, 
     "field3" : 3 
    } 
} 

MongoDB 3.3:

db.pipeline.aggregate(
    { $project: { 
     field3: { 
      $gt: ['$field1', 10] 
     }, 
     fields: "$$ROOT" 
    }} 
) 

उत्पादन दोनों नए गणना क्षेत्र (रों) और सभी मूल क्षेत्रों शामिल होंगे। 11 addFields एकत्रीकरण चरण प्रस्तुत करता है जो आप चाहते हैं। MongoDB समस्या ट्रैकर में यह प्रविष्टि देखें: SERVER-5781 - Implement $addFields aggregation stage for using expression language to add new fields to a document

5

जहां $project निर्दिष्ट करने की आवश्यकता है कि कौन से फ़ील्ड गुजरने के लिए $addFields सभी फ़ील्ड वापस कर देगा और निर्दिष्ट फ़ील्ड को जोड़ देगा या प्रतिस्थापित करेगा।

{ $addFields: { field3: { $gt: ['$field1', 10] } } } 

वही हासिल करेगा जो आप चाहते हैं।

कृपया ध्यान दें, यह सुविधा मोंगो संस्करण 3.4 में जोड़ा गया था।

+0

आपने अपना जीवन बचाया – user2486322

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