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

Mongoose/Mongodb Aggregate - gruppe og gennemsnit flere felter

Dette virkede for mig:

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

Output:

[
  { _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 ville være dejligt, hvis jeg på en eller anden måde kunne filtrere dette ud fra andre faktorer. For eksempel har hvert indlæg en forfatter (reference til Brugermodel). Hvordan vil jeg filtrere ud fra forfatterens land.navn eller køn?

Brugermodel:

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

Sådan noget her

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



  1. Hvordan bruger man fetchNewObject med update.one ReactiveMongo?

  2. Mongodb:sorter dokumenter efter array-objekter

  3. Indstil Mongo Timeout i Spring Boot

  4. MongoDB bulkWrite()