0

Ich bin Anfänger in MongoDB. Ich brauche individuelle Spaltenzählungen von einer einzigen MongoDB-Abfrage. Zum Beispiel habe ich eine Sammlung hotelCollection mit Feldern cityid , starRating, area, locality. Jetzt werde ich Parameter cityid als 123 auf die Abfrage übergeben und ich brauche das Ergebnis zu holen als:Wie erhalten Sie individuelle Zählungen von Spalten in einer Sammlung mit mongodb-Abfrage?

result: { 
    starCount: { 
     1star: 5, 
     2star: 6, 
     3star: 5 
    }, 
    areaCount: { 
     area1: 4, 
     area2: 12 
    }, 
    localityCount: { 
     locality1: 10, 
     locality2: 6 
    } 
} 

Ich versuchte aggregate Abfrage verwenden, aber ich bin immer nur eine Spaltenanzahl am Ende. Also habe ich am Ende 4 aggregate Anfragen vorläufig geschrieben. Jetzt sehe ich mich mit Leistungsproblemen konfrontiert. Ich habe viel gegoogelt, konnte aber keine Lösung finden. Bitte helfen Sie mir, dieses Problem zu lösen.

Antwort

0

Sie benötigen einen bedingten Ausdruck in Ihrem $sum Operator, der für die cityid , starRating, area, locality Tasten Werte unter Verwendung des Vergleichsoperator $eq überprüfen.

Sie können Ihre Pipeline durch diesen Ausdruck restrukturieren Zugabe wie folgt:

db.hotelCollection.aggregate([ 
    { "$match": { "cityid": 123 } }, 
    { 
     "$group" : { 
      "_id": null, 
      "1star": { 
       "$sum": { 
        "$cond": [ 
         { "$eq": ["$starRating", 1] }, 
         1, 0 
        ] 
       } 
      }, 
      "2star": { 
       "$sum": { 
        "$cond": [ 
         { "$eq": ["$starRating", 2] }, 
         1, 0 
        ] 
       } 
      }, 
      "3star": { 
       "$sum": { 
        "$cond": [ 
         { "$eq": ["$starRating", 3] }, 
         1, 0 
        ] 
       } 
      }, 
      "area1": { 
       "$sum": { 
        "$cond": [ 
         { "$eq": ["$area", 1] }, 
         1, 0 
        ] 
       } 
      }, 
      "area2": { 
       "$sum": { 
        "$cond": [ 
         { "$eq": ["$area", 2] }, 
         1, 0 
        ] 
       } 
      }, 
      "locality1": { 
       "$sum": { 
        "$cond": [ 
         { "$eq": ["$locality", 1] }, 
         1, 0 
        ] 
       } 
      }, 
      "locality2": { 
       "$sum": { 
        "$cond": [ 
         { "$eq": ["$locality", 2] }, 
         1, 0 
        ] 
       } 
      } 
     } 
    }, 
    { 
     "$project" : { 
      "_id": 0, 
      "starCount": { 
       "1Star": "$1star", 
       "2Star": "$2star", 
       "3Star": "$3star" 
      }, 
      "areaCount": { 
       "area1": "$area1", 
       "area2": "$area2" 
      }, 
      "localityCount": { 
       "locality1": "$locality1", 
       "locality2": "$locality2" 
      }    
     } 
    } 
]) 
+0

Chridam: Hallo Sie für das Update und sorry für späte Antwort danken. Hier kann ich für '' starcount'' vorhersagen, aber für '' Bereiche'' kann ich nicht vorhersagen, da ich nicht weiß, wie viele Gebiete unter die Stadt kommen werden, und es ist dynamischer Inhalt. Bitte geben Sie mir eine andere Lösung, um mein Problem zu lösen. – anil

Verwandte Themen