2013-11-21 15 views
6

Quindi sono davvero nuovo a MongoDB e agli archivi di documenti. Sto avendo difficoltà a cercare la soluzione più elegante ed efficiente per fare quanto segue:Il modo più efficiente per ottenere tutto il valore per un campo in MongoDB e Node.js

Ho una raccolta chiamata test. In ogni test ci sono azioni con un proprietario del campo. Vedi sotto:

{ 
"_id" : ObjectId("528c731a810761651c00000f"), 
"actions" : [ 
    { 
     "action" : "6784", 
     "owner" : "MERCHAND_1", 
     "_id" : ObjectId("528c7292810761651c00000e") 
    }, 
    { 
     "action" : "1", 
     "owner" : "MERCHAND_1", 
     "_id" : ObjectId("528c7292810761651c00000d") 
    }, 
    { 
     "action" : "1358", 
     "owner" : "MERCHAND_2", 
     "_id" : ObjectId("528c7292810761651c00000c") 
    } 
], 
"name" : "Test 1", 
"product" : ObjectId("528bc4b3a0f5430812000010") 

}

Come posso avere una lista (array) di ogni valore distinto proprietario utilizzando Node.js & MongoDB (sto usando il driver mangusta). È meglio farlo sul lato mongoside o node.js? Se per esempio ho eseguito la funzione sul tavolo precedente, dovrebbe restituire:

[ 
    { 
     "owner":"MERCHAND_1" 
    }, 
    { 
     "owner":"MERCHAND_2" 
    } 
] 

risposta

7

È possibile farlo con MongoDB usando il comando

db.runCommand({ 
    distinct: 'tests', 
    key: 'actions.owner' 
}); 

che vi dà

{ 
    "values" : [ 
    "MERCHAND_1", 
    "MERCHAND_2" 
    ], 
    "stats" : {...}, 
    "ok" : 1 
} 

Ciò comprenderà tutti documento nelloCollezione. Se, tuttavia, volevi semplicemente controllare un singolo documento, potresti riscrivere il comando come

db.runCommand({ 
    distinct: 'tests', 
    key: 'actions.owner', 
    query: { _id: ObjectId("528c731a810761651c00000f") } 
}); 
+0

Grazie, questo è tutto ciò che dovevo sapere. Qual è la differenza tra runCommand e la chiamata diretta alla funzione distinta? –

+0

Il metodo 'db.collection.distinct()' fornisce un wrapper attorno al comando 'distinct'. In realtà sta chiamando il comando in background, ma non restituisce le proprietà 'stats' o' ok'. – Travis

11

MongoDB supporta un comando distinct per fare questo. È possibile utilizzare la notazione a punti per indirizzare i campi all'interno degli array come in questo caso. Nella shell:

db.test.distinct('actions.owner') 

uscite:

[ 
    "MERCHAND_1", 
    "MERCHAND_2" 
] 
+0

Wow è fantastico. Grazie. –

Problemi correlati