2014-06-12 11 views
6

ho questi 3 richieste:

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

Mi piacerebbe fare una sola richiesta ... Così ho provato quanto segue:

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 
    } } 
]); 

ma ho ottenuto l'errore:

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

Credo che non possiamo usare $ esiste con $ project.

Qualche consiglio su un buon approccio? Grazie

risposta

10

Hai avuto l'idea di base giusta ma $exists è una condizione di query, quindi è valida solo con un $match. Quello che vogliamo è il $ifNull all'operatore di fare essenzialmente la stessa cosa:

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 
    } } 
]); 

Così il $ifNull o restituisce il valore attuale del campo se esiste o la "destra" argomento viene restituito se non lo fa . Il valore restituito diverso da false è interpretato come true (a meno che, naturalmente, il valore non sia effettivamente falso).

In sostanza, questo offre la stessa funzionalità di test logico per l'esistenza di una proprietà nel documento.

+0

Grazie Neil per la spiegazione! –

+0

In realtà Neil, requestA_count, requestB_count, requestC_count hanno sempre lo stesso valore ...: /! Voglio dire, se requestA_count = 9 quindi requestB_count e requestC_count = 9 –

+0

@JohnSmith puoi modificare la tua domanda per mostrare alcuni dati con campi diversi presenti. Per me questo funziona. Se il campo non esiste, il valore passato alla somma è 0. –

Problemi correlati