【问题标题】:The field "$name" must be an accumulator object字段“$name”必须是一个累加器对象
【发布时间】:2019-06-23 17:40:51
【问题描述】:

我有一个查询,当我使用 $group 时,错误显示“字段“$name 必须是累加器对象”,如果删除归档的“$name”一切正常并且我只尝试使用“name”而不是“$name”,错误继续存在。

   User.aggregate([
    {
      $match: {
        "storeKey": req.body.store        
      }
  },
  {
      $group: {
          "_id": "$_id",          
          "name": "$name",              
          "count": {
              "$sum": 1
          },
          "totalValue": {
              "$sum": "$value"
          }      
      }
  },
  {
    $sort: sort
  },
  {
     $skip: req.body.limit * req.body.page
  },
  {
     $limit: req.body.limit
  }
])...

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:
    db.faq_feedback.aggregate({ 
       $lookup:{ 
          "from":"faq",
          "localField":"question_id",
          "foreignField":"_id",
          "as":"faq"
       }
    },
    { 
       $unwind:"$faq"
    },
    
    { 
       $project:{ 
          "question_id":1,
          "lang":"$faq.lang",
          "feedback":"$faq.feedback",
          "question":"$faq.question",
          "yes":{ 
             "$cond":[ 
                { 
                   "$eq":[ 
                      "$feedback",
                      "yes"
                   ]
                },
                1,
                0
             ]
          },
          "no":{ 
             "$cond":[ 
                { 
                   "$eq":[ 
                      "$feedback",
                      "no"
                   ]
                },
                1,
                0
             ]
          }
       }
    },
    
    { 
       $group:{ 
          "_id":"$question_id",
    
          "yes":{ 
             "$sum":"$yes"
          },
          "no":{ 
             "$sum":"$no"
          },
          "question":{"$first":"$question"},
          "lang":{"$first":"$lang"}
       }
    },
    { 
       $limit:10000
    },
    { 
       $skip:0
    })
    

    【讨论】:

    • 您好,欢迎来到 stackoverflow,感谢您的回答。虽然这段代码可能会回答这个问题,但您是否可以考虑添加一些解释来说明您解决了什么问题,以及您是如何解决的?这将有助于未来的读者更好地理解您的答案并从中学习。
    【解决方案2】:

    有些聚合运算符只能在$group聚合中使用,命名为$group accumulators

    就像您在这里使用 $sum 一样,您也必须使用 name

    { "$group": {
      "_id": "$_id",
      "name": { "$first": "$name" },  //$first accumulator
      "count": { "$sum": 1 },  //$sum accumulator
      "totalValue": { "$sum": "$value" }  //$sum accumulator
    }}
    

    累加器就像元素数组一样,它作为数组累加。 $first -> 给出名称组中的第一个名称

    示例: 所以如果你有$_id 相同但不同的名字["Darik","John"] 指定$first 将给Darik 并且类似地$last 将给John

    【讨论】:

    • 有效!但是我阅读了有关$first 的文档,但我对如何使用以及为什么使用一无所知
    • $first 将始终在应用$group 阶段后为您提供第一个文档。同样$last 会给你最后一个文档。
    • 如果我们想要所有值该怎么办。 @Ashh
    • 使用$$ROOT@,mufazmi
    【解决方案3】:
    $group: {
        _id:"$_id", 
        "name" :{ $last: '$name' }, 
        "count" : { $sum: 1 }, 
        "totalValue": { "$sum": "$value" }
    }
    

    【讨论】:

    • 嗨,你能解释一下你的答案吗?
    猜你喜欢
    • 2020-01-01
    • 2017-10-17
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 2017-06-12
    • 2018-04-14
    相关资源
    最近更新 更多