2014-12-15 12 views
8

Esperti.MongoDB allowDiskUse non funziona ..

Sono nuovo di MongoDB, ma sanno abbastanza per ottenere la mia auto nei guai .. caso in questione:

db.test.aggregate(
[ 
    {$group: {_id: {email: "$email", gender: "$gender"}, cnt: {$sum: 1}}}, 
    {$group: {_id: "$_id.email", cnt: {$sum: 1}}}, 
    {$match: {cnt: 2}} 
], 
    {allowDiskUse : true} 
) 

e non importa ciò che le variazioni che cerco, io continuo a ricevere lo stesso errore ("Passo allowDiskUse: true di opt in "):

errore (" Stampa dello stack ") @: 0() @ src/mongo/shell/utils.js: 37 ([oggetto Array], [oggetto Object ]) @ src/mongo/shell/collection.js: 866 @ (shell): 7

eccezione non rilevata: aggregato non riuscito: {"errmsg": "eccezione: Errore ricevuto in risposta da mongo1.mscnet.com:27017: {$ err: \" Limite di memoria superato per $ gruppo, ma non consentito esterno ordinare. Passo allowDiskUse:. Vera di opt-in \ "il codice: 16945}", "codice": 16945, "ok": 0 }

FYI: Sto usando Mongo 2.6

+0

Stai utilizzando una shell 2.6? Cosa restituisce 'version()' nella shell 'mongo'? Inoltre, stai usando estensioni della shell come Mongo-Hacker? In tal caso, proverei ad avviare la shell usando 'mongo --norc' per testare senza estensioni. La tua sintassi sembra corretta quindi sospetto che potresti inavvertitamente utilizzare una versione dell'helper 'aggregate()' che non supporta le opzioni di passaggio al comando di aggregazione (che sono state aggiunte nella shell di MongoDB 2.6). – Stennie

+0

Sto usando "MongoDB versione shell: 2.6.5". Sebbene stavo usando un'app di terze parti chiamata RoboMongo (versione 0.8.4). Ora sto usando la shell CMD con --norc .. e sembra funzionare .. Suppongo che fosse il mio cliente. Ma puoi spiegarmi qualcosa per me? .. L'aggregazione non avviene sul mio PC (vero?). Non vedo alcun utilizzo di rete/CPU sul mio pc. Allora, qual è il "cliente" e come/perché ha effetto sul trattamento dei dati? Grazie! –

+1

I client come la shell 'mongo' o Robomongo forniscono [' aggregatori() 'helper] (http://docs.mongodb.org/manual/reference/method/db.collection.aggregate/) per rendere più conveniente il lavoro con il sottostante [comando 'aggregate'] (http://docs.mongodb.org/manual/reference/command/aggregate/) che gira sul tuo server MongoDB. Nelle versioni di MongoDB precedenti alla 2.6 il comando di aggregazione non supportava alcuna opzione, quindi le versioni precedenti degli helper 'aggregate()' ignoreranno quelle. Se '--norc' funziona per la shell' mongo', sospetto che tu abbia una versione precedente di Mongo-Hacker (ho commesso una correzione ad agosto 2014) – Stennie

risposta

15

Utilizzare la query aggregata nel comando run, consentirà di utilizzare il tag allowDiskUse.

db.runCommand(
    { aggregate: "test", 
    pipeline: [ 
       {$group: {_id: {email: "$email", gender: "$gender"}, cnt: {$sum: 1}}}, 
       {$group: {_id: "$_id.email", cnt: {$sum: 1}}}, 
       {$match: {cnt: 2}} 
       ], 
    allowDiskUse: true 
    } 
) 
3

provare a scrivere in questo modo,

db.stocks.aggregate([ 
        { $project : { cusip: 1, date: 1, price: 1, _id: 0 } }, 
        { $sort : { cusip : 1, date: 1 } } 
        ], 
        { 
         allowDiskUse: true 
        } 
        ); 

E un'altra cosa,
vostro errore sulla dimensione massima del documento è inerente a Mongo. Mongo non può mai restituire un documento (o una sua matrice) più grande di 16 megabyte. Non posso dirti perché, perché non hai menzionato nulla sulla dimensione dei dati, ma probabilmente significa che il documento che stai creando come risultato finale è troppo grande. Prova a diminuire il parametro $ limit, forse? Inizia impostandolo su 1, esegui un test, quindi aumentalo e guarda quanto grande diventa il risultato quando lo fai