sql >> Databáze >  >> NoSQL >> MongoDB

Mongoose/Mongodb Aggregate - skupina a průměr více polí

Toto fungovalo pro mě:

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

Výstup:

[
  { _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 }
]

ALE bylo by skvělé, kdybych to mohl nějak filtrovat na základě jiných faktorů. Například každý příspěvek má autora (odkaz na model uživatele). Jak bych postupoval při filtrování na základě země.jména nebo pohlaví autora?

Uživatelský model:

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ěco jako toto

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



  1. Dotaz Mongodb na prvky vnořeného pole

  2. Jak funguje MongoDB $text search?

  3. Možnost shody příkazu Redis scan nefunguje v Pythonu

  4. Seznam otázek PHP Mongo:Co vrátí _construct, když má replicaSet hodnotu true?