2011-11-21 10 views
30

So che MongoDB è in grado di gestire un sacco di richieste/sec, ma diciamo che devo interrogare un sacco di documenti di una collezione dato il loro _id; ciò che suona meglio: fare un $ in sull'attributo _id con tutti gli id ​​che voglio ottenere, o ricominciare con le query findOne?

risposta

32

Vorrei assolutamente utilizzare la query $ in e fornire un array di _id.

Esempio:

db.collection.find({ 
    "key": { 
     "$in": [ 
      ObjectId("xxx"), 
      ObjectId("yyy"), 
      ObjectId("zzz") 
     ] 
    } 
}) 

Perché?

  • Se si esegue un ciclo, è presente una certa quantità di installazione e rimozione per ogni query che crea cursori esaurienti che creerebbero un sovraccarico.
  • Se non lo si fa su un computer locale, crea anche un sovraccarico TCP/IP per ogni richiesta. A livello locale è possibile utilizzare socket di dominio.
  • C'è un indice su "_id" creato per impostazione predefinita e la raccolta di un gruppo di documenti da restituire in una richiesta batch deve essere estremamente veloce, quindi non è necessario suddividere questo in query più piccole.

C'è della documentazione aggiuntiva here se si desidera verificarlo.

+8

E se ci sono molti articoli in $ in ... diciamo 100 o 1.000? – ewindsor

+0

@ewindsor qualsiasi cosa fino a 1000 di solito è ok. Dopodiché riconsidererei lo schema che hai e comincerò a pre-calcolare i dati. –

+1

è possibile utilizzare $ in su su un array di oggetti JSON? –