2013-11-24 17 views
9

Io attualmente ho oggetti in mongo impostato come questo per la mia applicazione (esempio semplificato, ho rimosso alcuni campi irrilevanti per chiarezza qui):Mongo trovare query per le matrici più lunghe all'interno oggetto

{ 
    "_id" : ObjectId("529159af5b508dd71500000a"), 
    "c" : "somecontent", 
    "l" : [ 
     { 
      "d" : "2013-11-24T01:43:11.367Z", 
      "u" : "User1" 
     }, 
     { 
      "d" : "2013-11-24T01:43:51.206Z", 
      "u" : "User2" 
     } 
    ] 
} 

Quello che vorrei do è eseguire una query di ricerca per restituire gli oggetti che hanno la lunghezza di array più alta sotto "l" e ordinare il più alto-> il più basso, il limite a 25 risultati. Alcuni oggetti possono avere 1 oggetto nella matrice, alcuni possono avere 100. Mi piacerebbe scoprire quali hanno il massimo sotto "l". Sono nuovo di mongo e ho ottenuto tutto il resto fino a questo punto, ma non riesco a capire i parametri giusti per ottenere questa query specifica. Dove mi sto confondendo è come gestire il conteggio della lunghezza dell'array, l'ordinamento, ecc. Potrei codificarlo manualmente analizzando tutto nella raccolta, ma sono sicuro che ci deve essere un modo per mongo di fare questo lontano Più efficiente. Non sono contrario all'apprendimento, se qualcuno conosce risorse per query più avanzate o potrebbe aiutarmi, sarei davvero grato perché questo è l'ultimo pezzo! :-)

Come nota a margine, node.js e mongo insieme sono fantastici e vorrei iniziare a usarli in congiunzione molto tempo fa.

risposta

14

Utilizzare la struttura di aggregazione. Ecco come:

db.collection.aggregate([ 
    { $unwind : "$l" }, 
    { $group : { _id : "$_id", len : { $sum : 1 } } }, 
    { $sort : { len : -1 } }, 
    { $limit : 25 } 
]) 
+0

Grazie! Esattamente quello di cui avevo bisogno. Pensavo che l'aggregazione fosse l'approccio corretto ma non ero sicuro di come utilizzarlo correttamente. Molto apprezzato :-) – mike029

1

Non esiste un modo semplice per farlo con lo schema esistente. La ragione di ciò è che non c'è nulla in mongodb per trovare la dimensione della lunghezza dell'array. Sì, hai l'operatore $size, ma il modo in cui funziona è solo trovare tutti gli array di una lunghezza specifica.

Quindi non è possibile ordinare la query di ricerca in base alla lunghezza dell'array. L'unica via d'uscita ragionevole è aggiungere un ulteriore campo al tuo schema che manterrà la lunghezza dell'array (avrai qualcosa come "l_length: 3" in aggiunta ai tuoi campi per ogni documento). La cosa buona è che puoi farlo facilmente guardando questo relevant answer e dopo questo devi solo assicurarti di incrementare o decrementare questo valore quando stai modificando la matrice.

Quando aggiungerai questo campo, puoi facilmente ordinarlo per quel campo e inoltre puoi sfruttare gli indici.

Problemi correlati