MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Ordinamento per rilevanza con MongoDB

MapReduce e farlo lato client sarà troppo lento:dovresti usare il framework di aggregazione (nuovo in MongoDB 2.2).

Potrebbe assomigliare a questo:

db.collection.aggregate([
   { $match : { "tags": { "$in": ["bar", "hello"] } } },
   { $unwind : "$tags" },
   { $match : { "tags": { "$in": ["bar", "hello"] } } },
   { $group : { _id: "$title", numRelTags: { $sum:1 } } },
   { $sort : { numRelTags : -1 } }
   //  optionally
   , { $limit : 10 }
])

Nota che il primo e il terzo membro della pipeline sembrano identici, questo è intenzionale e necessario. Ecco cosa fanno i passaggi:

  1. trasmetti solo i documenti che contengono il tag "bar" o "hello".
  2. svolgere l'array di tag (che significa dividere in un documento per elemento di tag
  3. passa solo i tag esattamente "bar" o "hello" (cioè scarta il resto dei tag)
  4. raggruppa per titolo (potrebbe anche essere "$_id" o qualsiasi altra combinazione di documento originale sommando quanti tag (di "bar" e "hello") aveva
  5. ordina in ordine decrescente per numero di tag rilevanti
  6. (facoltativamente) limita il set restituito ai primi 10.