好吧,我的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
}
这里可能会发生什么?
答案 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;