如何在猫鼬中找到平均星级评分

How to find Average of star Rating in mongoose

我正在做我最后一年的大学项目 On MERN stack。 我的问题在下面提到,请帮助我。

const Organization = mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    current_rating: {
        type: Number,
        default: 0
    },
    rating: [{
        user: {
            type: 'ObjectId',
            ref:'user'   
        },
        user_name:String,
        experience: String,
        feedback: String,
        star: Number,
        date: {
            type: Date,
            default:Date.now
        }
     }]
  }); 

例如组织集合将如下所示

[
 {
  name: 'abc.com'
    email: 'abc@gmail.com'
    current_rating: 0,
    rating: [
    {
      user: new ObjectId("623cb8bec55d003c2d9dd3da"),
      user_name: 'rupesh',
      experience: 'very good',
      feedback: 'In publishing and graphic design, Lorem ipsum',
      star: 3.5,
      _id: new ObjectId("6267d9301c4ceac2d4e6956a"),
      date: 2022-04-26T11:36:16.656Z
    },
    {
      user: new ObjectId("623cb8bec55d003c2d9dd3da"),
      user_name: 'rupesh',
      experience: 'very good',
      feedback: 'In publishing and graphic design, Lorem ipsum',
      star: 4,
      _id: new ObjectId("6267d9d6e6296ebf5e289155"),
      date: 2022-04-26T11:39:02.918Z
    },
    {
      // some content
    },
    .
    .
    .
     //and many more rating for this organization

 },
 {
   // data for other organization
 }
]

我正在尝试这个查询,但它在 mongoose 中不起作用

const updatedCurrentRating = await Organization.findOneAndUpdate({ _id: req.params.org_id }, {
            $set: { current_rating: { $avg: 'rating.$.star' } }
        }, {
            new: true,
            useFindAndModify: true
        });
        console.log(updatedCurrentRating);

AssertionError,我在这个查询中得到的

CastError: Cast to Number failed for value "{ '$avg': 'rating.$.star' }" (type Object) at path "current_rating"
    at model.Query.exec (D:\react\project For Inter\server\node_modules\mongoose\lib\query.js:4650:21)
    at model.Query.Query.then (D:\react\project For Inter\server\node_modules\mongoose\lib\query.js:4749:15)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  messageFormat: undefined,
  stringValue: `"{ '$avg': 'rating.$.star' }"`,
  kind: 'Number',
  value: { '$avg': 'rating.$.star' },
  path: 'current_rating',
  reason: AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
  
    assert.ok(!isNaN(val))
  
      at castNumber (D:\react\project For Inter\server\node_modules\mongoose\lib\cast\number.js:27:10)
      at SchemaNumber.cast (D:\react\project For Inter\server\node_modules\mongoose\lib\schema\number.js:380:12)
      at SchemaNumber.SchemaType.applySetters (D:\react\project For Inter\server\node_modules\mongoose\lib\schematype.js:1179:12)
      at SchemaNumber.SchemaType._castForQuery (D:\react\project For Inter\server\node_modules\mongoose\lib\schematype.js:1613:15)
      at SchemaNumber.castForQuery (D:\react\project For Inter\server\node_modules\mongoose\lib\schema\number.js:434:14)
      at SchemaNumber.SchemaType.castForQueryWrapper (D:\react\project For Inter\server\node_modules\mongoose\lib\schematype.js:1580:20)
      at castUpdateVal (D:\react\project For Inter\server\node_modules\mongoose\lib\helpers\query\castUpdate.js:527:19)
      at walkUpdatePath (D:\react\project For Inter\server\node_modules\mongoose\lib\helpers\query\castUpdate.js:260:22)
      at castUpdate (D:\react\project For Inter\server\node_modules\mongoose\lib\helpers\query\castUpdate.js:96:7)
      at model.Query._castUpdate (D:\react\project For Inter\server\node_modules\mongoose\lib\query.js:4859:10) {
    generatedMessage: true,
    code: 'ERR_ASSERTION',
    actual: false,
    expected: true,
    operator: '=='
  },
  valueType: 'Object'
}

请告诉我如何获得组织的平均值 star 并将其存储到 current_rating

谢谢。

$avg 是一个聚合运算符,您不能在正常更新中使用它。 但是你可以像这样进行管道更新(它有 [ {$set ...]) 此外,您不能在聚合运算符上使用 $.star,因此路径也会更改。

Playmongo

const updatedCurrentRating = await Organization.findOneAndUpdate(
{ _id: req.params.org_id },
[{$set: { current_rating: { $avg: 'rating.star' } }}],
{
   new: true,
   useFindAndModify: true
});

console.log(updatedCurrentRating);