sql >> Databasteknik >  >> NoSQL >> MongoDB

Sortering efter relevans med MongoDB

MapReduce och att göra det på klientsidan kommer att gå för långsamt - du bör använda aggregeringsramverket (nytt i MongoDB 2.2).

Det kan se ut ungefär så här:

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

Observera att de första och tredje rörledningsmedlemmarna ser identiska ut, detta är avsiktligt och nödvändigt. Så här gör stegen:

  1. lämna endast dokument som har taggen "bar" eller "hej" i sig.
  2. linda upp taggarrayen (vilket betyder uppdelad i ett dokument per taggelement
  3. sänd bara taggar exakt "bar" eller "hej" (dvs. kassera resten av taggarna)
  4. gruppera efter titel (det kan också vara efter "$_id" eller någon annan kombination av originaldokument som lägger till hur många taggar (av "bar" och "hej") den hade
  5. sortera i fallande ordning efter antal relevanta taggar
  6. (valfritt) begränsa den returnerade uppsättningen till topp 10.


  1. Doktrin MongoDB hitta efter id

  2. Mongoose-schema:Validerar unikt fält, skiftlägesokänsligt

  3. MongoDB-index och $or-operatorn

  4. Uppdatera bild med collectionfs