2016-03-24 6 views
7

से मेल नहीं खाता है, मैं आईड्स (56e641d4864e5b780bb992c6 और 56e65504a323ee0812e511f2) द्वारा उत्पादों को दिखाना चाहता हूं और उपलब्ध होने पर छूट द्वारा घटाए जाने के बाद मूल्य दिखा सकता हूं।

मैं कुल का उपयोग कर अंतिम कीमत भरोसा कर सकते हैं, लेकिन इस वापसी एक संग्रह में सभी दस्तावेज़, कैसे यह केवल मैचों आईडी

"_id" : ObjectId("56e641d4864e5b780bb992c6"), 
"title" : "Keyboard", 
"discount" : NumberInt(10), 
"price" : NumberInt(1000) 

"_id" : ObjectId("56e65504a323ee0812e511f2"), 
"title" : "Mouse", 
"discount" : NumberInt(0), 
"price" : NumberInt(1000) 

"_id" : ObjectId("56d90714a48d2eb40cc601a5"), 
"title" : "Speaker", 
"discount" : NumberInt(10), 
"price" : NumberInt(1000) 

वापसी बनाने के लिए यह मेरा क्वेरी है

productModel.aggregate([ 
     { 
      $project: { 
       title : 1, 
       price: { 
        $cond: { 
         if: {$gt: ["$discount", 0]}, then: {$subtract: ["$price", {$divide: [{$multiply: ["$price", "$discount"]}, 100]}]}, else: "$price" 
        } 

       } 
      } 
     } 
    ], function(err, docs){ 
     if (err){ 
      console.log(err) 
     }else{ 
      console.log(docs) 
     } 
    }) 

और अगर मैं इस $in क्वेरी जोड़ने के लिए, यह रिटर्न खाली सरणी

productModel.aggregate([ 
      { 
       $match: {_id: {$in: ids}} 
      }, 
      { 
       $project: { 
        title : 1, 
        price: { 
         $cond: { 
          if: {$gt: ["$discount", 0]}, then: {$subtract: ["$price", {$divide: [{$multiply: ["$price", "$discount"]}, 100]}]}, else: "$price" 
        } 

       } 
      } 
     } 
    ], function(err, docs){ 
     if (err){ 
      console.log(err) 
     }else{ 
      console.log(docs) 
     } 
    }) 

उत्तर

11

आपका ids चर "स्ट्रिंग्स" का निर्माण किया जाएगा, और ObjectId मान नहीं होगा।

मोंगोस "ऑटोकास्ट" स्ट्रिंग मान ObjectId के लिए नियमित प्रश्नों में उनके सही प्रकार में हैं, लेकिन यह does not happen in the aggregation pipeline, जैसा कि समस्या # 1399 में वर्णित है।

इसके बजाय आप मैन्युअल रूप से टाइप करने के लिए सही कास्टिंग कार्य करना होगा:

ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) }) 

तो आप उन्हें अपने पाइपलाइन चरण में उपयोग कर सकते हैं:

{ "$match": { "_id": { "$in": ids } } } 

कारण है, क्योंकि एकत्रीकरण पाइपलाइनों "आम तौर पर" परिवर्तन दस्तावेज़ संरचना, और इसलिए मोंगोस कोई अनुमान नहीं लगाता है कि किसी भी पाइपलाइन चरण में "स्कीमा" दस्तावेज़ पर लागू होता है।

यह तर्कसंगत है कि "पहला" पाइपलाइन चरण जब यह $match चरण होता है तो यह करना चाहिए, क्योंकि वास्तव में दस्तावेज़ परिवर्तित नहीं होता है। लेकिन अभी यह ऐसा नहीं होता है।

कोई भी मान जो संभवतः "तार" हो सकता है या कम से कम सही बीएसओएन प्रकार को मिलान करने के लिए मैन्युअल रूप से कास्ट करने की आवश्यकता नहीं है।

+0

यही वह है, अब यह काम करता है। लेकिन आमतौर पर मैं idOneAndUpdate या अन्य क्वेरी में स्ट्रिंग के रूप में आईडी को फेंक देता हूं, और यह ठीक काम करता है, क्या समस्या केवल कुल में होती है? –

+1

@ मुहम्मददासलीररहमान यह वही है जो मैंने जवाब दिया था। एक '.find()' 'स्कीमा 'का उपयोग कर सकता है जिसमें निश्चित रूप से' _id' फ़ील्ड के लिए' ऑब्जेक्ट आईडी 'का डिफ़ॉल्ट प्रकार है। एकत्रीकरण पाइपलाइन ** ** नहीं '** स्कीमा' का उपयोग करें, जैसा कि मैंने वास्तव में पहले ही समझाया है। –

+0

यह मोंगोज़ 5 में काम नहीं कर रहा है –

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