2014-06-12 7 views
6

मैं इन 3 अनुरोध है:

db.mycollection.aggregate([ 
    { $group: { 
     '_id' : { user_id: '$user_id'}, 
     requestA_count: { $sum: { 
      $cond: [ {requestA:{'$exists':true}}, 1, 0 ] 
     } }, 
     requestB_count: { $sum: { 
      $cond: [ {requestB:{'$exists':true}}, 1, 0 ] 
     } }, 
     requestC_count: { $sum: { 
      $cond: [ {requestC:{'$exists':true}}, 1, 0 ] 
     } }, 
    } }, 
    { $project: { 
     _id: 0, 
     user_id: '$_id.user_id', 
     requestA_count: 1, 
     requestB_count: 1, 
     requestC_count: 1 
    } } 
]); 
:

db.mycollection.count({requestA:{$exists:true}}) 
db.mycollection.count({requestB:{$exists:true}}) 
db.mycollection.count({requestC:{$exists:true}}) 

मैं केवल एक अनुरोध करना चाहते हैं ... तो मैं निम्नलिखित की कोशिश की

लेकिन मैं त्रुटि मिली:

"errmsg" : "exception: invalid operator '$exists'", 

मुझे लगता है कि हम उपयोग नहीं कर सकते $ मौजूद है $ परियोजना के साथ।

एक अच्छा दृष्टिकोण के बारे में कोई सुझाव? धन्यवाद

उत्तर

10

आपके पास सही बुनियादी विचार था लेकिन $exists एक क्वेरी स्थिति है इसलिए केवल $match मान्य है। क्या आप चाहते हैं $ifNull ऑपरेटर अनिवार्य रूप से एक ही बात करने के लिए है:

db.mycollection.aggregate([ 
    { "$group": { 
     "_id" : { "user_id": "$user_id" }, 
     "requestA_count": { "$sum": { 
      "$cond": [ { "$ifNull": ["$requestA", false] }, 1, 0 ] 
     } }, 
     "requestB_count": { "$sum": { 
      "$cond": [ { "$ifNull": ["$requestB", false] }, 1, 0 ] 
     } }, 
     "requestC_count": { "$sum": { 
      "$cond": [ { "$ifNull": ["$requestC", false] }, 1, 0 ] 
     } }, 
    } }, 
    { "$project": { 
     "_id": 0, 
     "user_id": "$_id.user_id", 
     "requestA_count": 1, 
     "requestB_count": 1, 
     "requestC_count": 1 
    } } 
]); 

तो $ifNull या तो क्षेत्र के वर्तमान मूल्य देता है यदि वह मौजूद है या अगर यह नहीं है "सही पक्ष" तर्क दिया जाता है । false के अलावा लौटा हुआ मूल्य true होने के रूप में वर्णित है (बेशक जब तक मूल्य वास्तव में गलत नहीं है)।

अनिवार्य रूप से यह आपको दस्तावेज़ में किसी संपत्ति के अस्तित्व के लिए तार्किक परीक्षण की समान कार्यक्षमता देता है।

+0

स्पष्टीकरण के लिए नील धन्यवाद! –

+0

असल में नील, requestA_count, requestB_count, requestC_count हमेशा एक ही मान है ...: /! मेरा मतलब है, अगर requestA_count = 9 तो requestB_count और requestC_count = 9 –

+0

@ जॉनस्मिथ आप अलग-अलग फ़ील्ड के साथ कुछ डेटा दिखाने के लिए अपना प्रश्न संपादित कर सकते हैं। मेरे लिए यह काम करता है। यदि फ़ील्ड मौजूद नहीं है तो राशि को पास किया गया मान 0. –

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