sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongoose/Mongodb Aggregate - grupp och genomsnitt flera fält

Detta fungerade för mig:

  Post.aggregate([
    { $group: { _id: "$date", avgRating: { $avg: '$rating' }}}
  ]).
  then(function (res) {
    console.log(res); 
  })

Utdata:

[
  { _id: 'Aug 18, 2021', avgRating: 3.0212234706616727 },
  { _id: 'Aug 19, 2021', avgRating: 2.9680319680319682 },
  { _id: 'Aug 20, 2021', avgRating: 3.023976023976024 },
  { _id: 'Aug 17, 2021', avgRating: 2.9600665557404326 },
  { _id: 'Aug 21, 2021', avgRating: 3.072661217075386 }
]

MEN det skulle vara bra om jag på något sätt kunde filtrera detta utifrån andra faktorer. Till exempel har varje inlägg en författare (hänvisning till Användarmodell). Hur skulle jag gå tillväga för att filtrera baserat på författarens land.namn eller kön?

Användarmodell:

const userSchema = new Schema({
email: {
    type: String,
    required: true,
    unique: true
},
birthday: {
    type: Date,
    required: true,
},
gender:{
    type: String,
    required: true
},
country:{
    name: {
        type: String,
        required: true
    },
    flag: {
        type: String,
        // default: "/images/flags/US.png"
    }
},
avatar: AvatarSchema,
displayName: String,
bio: String,
coverColor: {
    type: String,
    default: "#343a40"
},
posts: [ 
    {
    type: Schema.Types.ObjectId,
    ref: "Post" 
    }
],
comments: [
    {
        type: Schema.Types.ObjectId,
        ref: "Comment"
    }
],
postedToday: {
    type: Boolean,
    default: false
},
todaysPost: {
    type: String
}
}) 

Något sånt här

    Post.aggregate([
    {$match: {"date": today}},
    {$group: {_id: {"country": "$author.country.name"}, avgRating: {$avg: "$rating"}}}
]).then(function(res) {
    console.log(res)
})



  1. Heroku Custom Domain fungerar inte

  2. MongoDB Skriv oro:3 måste-känna varningar

  3. Partitionera data runt en matchningsfråga under aggregering

  4. Finns det något sätt att flushall på ett kluster så att alla nycklar från master och slavar raderas från db