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

Sortering efter relevans med MongoDB

MapReduce og gøre det på klientsiden vil være for langsomt - du bør bruge aggregeringsrammerne (nyt i MongoDB 2.2).

Det kan se sådan ud:

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

Bemærk, at det første og tredje rørledningselement ser identiske ud, dette er bevidst og nødvendigt. Her er, hvad trinnene gør:

  1. giv kun dokumenter videre, som har tagget "bar" eller "hej" i sig.
  2. slap tags-arrayet ud (hvilket betyder opdelt i et dokument pr. tags-element
  3. giv kun tags med præcis "bar" eller "hej" (dvs. kasser resten af ​​tags)
  4. grupper efter titel (det kan også være efter "$_id" eller en hvilken som helst anden kombination af originalt dokument, der lægger op til, hvor mange tags (af "bar" og "hej") den havde
  5. sortér i faldende rækkefølge efter antal relevante tags
  6. (valgfrit) begrænse det returnerede sæt til top 10.


  1. Node js Mongodb Query NumberLong

  2. Arbejdsenhed i mongodb og C#

  3. MongoDB 4.x Real Time Sync til ElasticSearch 6.x +

  4. Heroku Custom Domain fungerer ikke