Skip to main content

I want to find the average rating of a Seller, but Seller is in an array of Sellers, how to find average rating of reviews

I have an array of favoriteSellers that contains multiple sellers. I want to find the user's favorite sellers and then find the averageRating, I did it previously for an array of sellers, but this is giving me an issue since the array is inside the array attribute called favoriteSellers, I want to add also the field averageRating since it is necessary for me.

When I retreive my code, the array looks like:

[
  {
    _id: new ObjectId("62a7ce9550094eafc7a61233"),
    user: new ObjectId("6287e4e61df773752aadc286"),
    favoriteSellers: [ new ObjectId("6293210asdce81d9f2ae1685") ],
  }
]

so each seller should have a field of average rating like:

_id: 'favorite_id.....'
user: 'my id',
favoriteSellers:[
{
 _id: 'kjskjhajkhsjk',
averageRating: 4.6
reviews:[.....],
...
},
{
 _id: 'id______hsjk',
averageRating: 2.6
reviews:[.....],
...
},
{
 _id: 'kjid______khsjk....',
averageRating: 3.6
reviews:[.....],
...
}
]

this is my code:

aggregatePipeline.push({
      $match: { user: req.user._id },
    });

aggregatePipeline.push({
  $addFields: {
    ratingSum: {
      $reduce: {
        initialValue: 0,
        input: "$favoriteStylists.reviews",
        in: { $sum: ["$$value", "$$this.rating"] },
      },
    },
  },
});

    //get average of rating ex. seller1 has a 4.5 averageRating field
    aggregatePipeline.push({
      $addFields: {
        averageRating: {
          $cond: [
            { $eq: [{ $size: "favoriteSellers.reviews" }, 0] }, //if it does not have any reviews, then we will just send 0
            0, //set it to 0
            {
              $divide: ["$ratingSum", { $size: "$reviews" }], //else we can divide to get average Rating
            },
          ],
        },
      },
    });

    let favList = await Favorite.aggregate(aggregatePipeline).exec();

Here is the schema for Favorite:

const favoriteSchema = new mongoose.Schema({
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
    unique: true,
  },
  favoriteSellers: [
    //create array of object id, make sure they are unique for user not to add multiple sellers
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Seller",
      unique: true,
    },
  ],
});

Here is my Seller schema:

const sellerSchema = new mongoose.Schema({
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
    unique: true,
  },
  business: businessSchema,
  sellerType: [String],
  reviews: [
    {
      by: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
        unique: true,
      },
      title: {
        type: String,
      },
      message: {
        type: String,
      },
      rating: Number,
      imagesUri: [String],
      timestamp: {
        type: Date,
        default: Date.now,
      },
    },
  ],
...
});
Via Active questions tagged javascript - Stack Overflow https://ift.tt/XYsceB0

Comments

Popular posts from this blog

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console...

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

The number of nodes and edges I calculated manually and by a method provided by networkx library dont match

I am trying to analyse a graph using networkx library in Python. I have implemented a function that returns the nodes and edges of that graph. After that I counted the number of nodes and edges by implementing the len() function for nodes and edges, which gave me 17 for both nodes and edges. However, when I used the method graph.number_of_nodes() of networkx library it gave me 53. My code: import pandas as pd import networkx as nx import matplotlib.pyplot as plt header_list = ["a","b","w"] E =pd.read_csv("aves-barn-swallow-contact-network.edges",sep=" ",header= None,names=header_list) # print(E.head()) # prints first few rows of the csv file G = nx.from_pandas_edgelist(E,"a","b",["w"]) nx.draw(G) plt.show() class GraphAnalyse: #finding nodes and edges def nodeEdge(self,Graph): nodes = Graph.nodes() edges = Graph.edges() ...