2016-07-31 16 views
0

Ich habe die folgende DokumentstrukturErhalten abgestimmt Teilmenge und Anzahl der Teilmenge in mongodb

{ 
    "_id" : ObjectId("578a14112acb483c1a0dce0a"), 
    "professionalInterests" : [ 
     { 
      "_id" : ObjectId("578a063a0068ec0c1320a1de"), 
      "interestName" : "Finance and Accounting" 
     }, 
     { 
      "_id" : ObjectId("578a063a0068ec0c1320a1e7"), 
      "interestName" : "Journalism and Mass Media" 
     }, 
     { 
      "_id" : ObjectId("578a063a0068ec0c1320a1e5"), 
      "interestName" : "Manufacturing Industry" 
     } 
    ], 
    "personalInterests" : [ 
     { 
      "_id" : ObjectId("578a063a0068ec0c1320a1d2"), 
      "interestName" : "Music" 
     }, 
     { 
      "_id" : ObjectId("578a063a0068ec0c1320a1d4"), 
      "interestName" : "Sports" 
     } 
    ] 
} 

und ich habe einige Interessen Array wie

var professionalInterests = [ 
      { 
       "interestName" : "Finance and Accounting" 
      } 
]; 
var personalInterests = [ 
      { 
       "interestName" : "Music" 
      } 
]; 

ich alle Dokumente abrufen möchten aber sortiert nach matched " berufliche Interessen "und" berufliche Interessen "mit der übereinstimmenden Anzahl. Ich versuchte $setIntersection, aber es funktioniert nicht für mich. Ich versuchte auch durch $unwind, $project, $size, aber es ist keine effektive Lösung. Resultierte Dokument enthalten soll, aber die Sortierung hängt von dem angepassten Interesse (wie wenn mit „userA“ 2 Interessen abgestimmt und „userB“ 3 Interessen abgestimmt und dann „userB“ ist oben in der Liste dann „userA“.

{ 
    professionalInterests : [],//user professional interests 
    personalInterests : [],//user personal interest 
    matchedProfessionalInterests : [],// contain the matched professional interest 
    matchedPersonalInterests : [],// contain the matched personal interest 
    matchedProfessionalInterestsCount : number, 
    matchedPersonalInterests : number 
} 
+1

Können Sie ein Beispiel für Daten angeben, die Sie erhalten möchten? –

+0

@AndriySimonov aktualisiert. –

Antwort

0

zur Lösung Ihres Problems benötigen Sie eine Aggregation Pipeline mit den Betreibern bauen Sie erwähnt haben hier eine Abfrage, die Daten zurückgibt benötigen Sie:.

db.interests.aggregate([{$project: {professionalInterests: 1, 
           personalInterests: 1, 
           matchedProfessionalInterests: {$setIntersection: [["Finance and Accounting", "Data Modeling"], "$professionalInterests.interestName"]}, 
           matchedPersonalInterests: {$setIntersection: [["Music"], "$personalInterests.interestName"]}}}, 
        {$project: {professionalInterests: 1, 
           personalInterests: 1, 
           matchedProfessionalInterests: 1, 
           matchedPersonalInterests: 1, 
           matchedProfessionalInterestsCount: {$size: "$matchedProfessionalInterests"}, 
           matchedPersonalInterestsCount: {$size: "$matchedPersonalInterests"}}}, 
        {$sort: {matchedProfessionalInterestsCount: -1, matchedPersonalInterests: -1}}]); 

Da es immer noch nicht klar, für mich welches Interesse, beruflich oder persönlich ist, Sie möchten die Ergebnisse bestellen, indem ich sie beide in die $ sort-Stufe gestellt habe. Sie können die $ sort einfach an Ihre Anforderungen anpassen. Siehe die $sort Bedienerdokumentation.

Verwandte Themen