如何从已返回的组中获取MongoDB中的AVG值?

时间:2015-08-28 14:20:06

标签: mongodb mongodb-query

好吧,我的MongoDB数据库中有以下集合:

{
  "_id": 1,
  "departamento_id": 1,
  "nome": "PRODUTO01",
  "valor": 10.511608123779297
}

所以,考虑到所有文件中的所有文件,愚蠢的我出去做了以下操作以获得 valor 字段中的平均值值:

db.produto.aggregate({
  "$group": {
    "_id": null,
    "avgValor": {
      "$avg": "$valor"
    }
  }
})

这有以下回报:

{
  "_id": null,
  "avgValor": 50.39681773098588
}

问题是,我需要在另一个查询中使用“avgValor”字段中的值。所以,我创建了一个变量,并尝试将创建的组的结果存储在其中。问题是,当我在控制台中键入第一个时间的变量名称时,它会产生奇迹,但是当我执行第二次时间时,MongoDB shell不返回任何内容。看看:

> db.produto.aggregate({"$group": {"_id": null, "avgValor": {"$avg": "$valor"}}})
{ "_id" : null, "avgValor" : 50.39681773098588 }
> var docMedia = db.produto.aggregate({"$group": {"_id": null, "avgValor": {"$avg": "$valor"}}})
> docMedia
{ "_id" : null, "avgValor" : 50.39681773098588 }
> docMedia
> docMedia
> docMedia
> docMedia

或者,如果我在查询中使用变量,系统将返回错误。看看:

> var docMedia = db.produto.aggregate({"$group": {"_id": null, "avgValor": {"$avg": "$valor"}}})
> db.produto.find({valor: {$lte: docMedia.avgValor}})
Error: error: {
    "$err" : "Can't canonicalize query: BadValue cannot compare to undefined",
    "code" : 17287
}

这里可能会发生什么?

1 个答案:

答案 0 :(得分:2)

在shell中,aggregate返回一个游标对象,而不是结果文档本身。在shell中评估游标对象时,shell会迭代它,耗尽游标。这就是为什么当你第二次评估时它什么也不返回。

相反,请在toArray()的结果上调用aggregate,以便将结果作为可以更轻松使用的数组获取。

var results = db.produto.aggregate({
  "$group": {
    "_id": null,
    "avgValor": {
      "$avg": "$valor"
    }
  }
}).toArray();
var avgValor = results[0].avgValor;

或者在这种情况下,$group null确保只有一个结果,您只需在光标上调用next()即可获得一个结果doc:

var result = db.produto.aggregate({
  "$group": {
    "_id": null,
    "avgValor": {
      "$avg": "$valor"
    }
  }
}).next();
var avgValor = result.avgValor;