sql >> Database >  >> NoSQL >> MongoDB

Sorteren op relevantie met MongoDB

MapReduce en het aan de clientzijde doen zal te traag zijn - u moet het aggregatieraamwerk gebruiken (nieuw in MongoDB 2.2).

Het kan er ongeveer zo uitzien:

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 }
])

Merk op dat de eerste en derde pijplijnleden er identiek uitzien, dit is opzettelijk en nodig. Dit is wat de stappen doen:

  1. geef alleen documenten door die de tag "bar" of "hallo" bevatten.
  2. ontspan de tags-array (wat betekent opgesplitst in één document per tags-element
  3. alleen tags doorgeven die exact "bar" of "hallo" zijn (d.w.z. de rest van de tags weggooien)
  4. groeperen op titel (het kan ook op "$_id" of een andere combinatie van origineel document zijn, waarbij wordt opgeteld hoeveel tags (van "bar" en "hallo") het had
  5. sorteer in aflopende volgorde op aantal relevante tags
  6. (optioneel) beperk de geretourneerde set tot top 10.


  1. Een NoSQL-forumtoepassing modelleren met C# / ASP.net MVC

  2. Selecteer Groeperen op aantal en verschillende tellingen in dezelfde mongodb-query

  3. Prestaties van Redis vs Disk in caching-applicatie

  4. Veel tot veel update in MongoDB zonder transacties