2013-10-04 11 views
7

Ho i seguenti dati in MongoDB (semplificato per ciò che è necessario alla mia domanda).Query MongoDB per trovare la proprietà del primo elemento dell'array

{ 
    _id: 0, 
    actions: [ 
     { 
      type: "insert", 
      data: "abc, quite possibly very very large" 
     } 
    ] 
} 
{ 
    _id: 1, 
    actions: [ 
     { 
      type: "update", 
      data: "def" 
     },{ 
      type: "delete", 
      data: "ghi" 
     } 
    ] 
} 

Quello che mi piacerebbe è trovare il primo tipo di azione per ogni documento, ad es.

{_id:0, first_action_type:"insert"} 
{_id:1, first_action_type:"update"} 

(Va bene se i dati strutturati in modo diverso, ma ho bisogno di quei valori presenti, in qualche modo.)

EDIT: Ho provato db.collection.find({}, {'actions.action_type':1}), ma, ovviamente, che restituisce tutti elementi dell'array azioni .

NoSQL è abbastanza nuovo per me. Prima, avrei memorizzato tutto questo in due tabelle in un database relazionale e fatto qualcosa come SELECT id, (SELECT type FROM action WHERE document_id = d.id ORDER BY seq LIMIT 1) action_type FROM document d.

+1

semplicemente '... azioni [0]' per 'collezione .find method' –

+0

Questi documenti sono grandi ... Sto cercando di utilizzare una proiezione o qualcosa che mi aiuti a ottenere solo ciò di cui ho bisogno. –

+0

potresti aggiungere indici –

risposta

11

È possibile utilizzare $slice operatore in proiezione. (ma per quello che fai non sono sicuro che l'ordine dell'array rimanga lo stesso quando lo aggiorni.))

db.collection.find({},{'actions':{$slice:1},'actions.type':1}) 
1

È anche possibile utilizzare il Aggregation Pipeline introdotto nella versione 2.2:

db.collection.aggregate([ 
    { $unwind: '$actions' }, 
    { $group: { _id: "$_id", first_action_type: { $first: "$actions.type" } } } 
]) 
+0

Restituirà l'intero array, è necessario uno svolgimento prima del gruppo. In questo modo: db.collection.aggregate ([{$ unwind: '$ actions'}, {$ group: {_id: "$ _id", first_action_type: {$ first: "$ actions.type"}}}]) – attish

+0

Errore di sintassi: '{" $ actions.type "}' –

+0

@PaulDraper Ci dispiace avere un errore di battitura. Risolto, puoi provare ora :) – Agis

Problemi correlati