在特定职位上收集的所有领域的总和

我的数据集是这样的

{ "_id" : ObjectId("6a1464430b4215046c768y66"), "a" : 5, "b" : 4, "c" : 2, "d" : 14, "e" : 7, "f" : 25, "g" : 85, } 

现在我只想在这个ID上的所有字段的总和。 我的查询是

 db.collection.aggregate([ {$match:{_id: req.body.id}}, {$project: {total: { $sum: [ "$a", "$b", "$c", "$d","$e","$f","$g" ]}}}]); 

使用$match ,它返回空白数组[]。 当不使用$match那么它将返回总和,但所有不是这个ID。

你也可以使用$add

 db.collection.aggregate([ {$match:{_id: ObjectId("6a1464430b4215046c768y66")}}, {$project: { total: {$add: ["$a", "$b", "$c"]}}} // etc. ]) 

$sum应该工作。 难道是$matchpipe道不返回任何结果?

我不是使用哪个驱动程序,而是在你的代码中使用它来解释你的id。 但是,如果直接在数据库中search,则应该使用特定的_id

尝试只执行匹配,并找出:

 db.collection.aggregate([ {$match:{_id: ObjectId("6a1464430b4215046c768y66")}} ]) 

如果在你的数据库$match执行的$match返回一个结果,但不是通过你的node.js应用程序,那么试试这个:

 ObjectId = require('mongodb').ObjectID; db.collection.aggregate([ {$match:{_id: new ObjectId(req.body.id})}}, {$project: { total: {$add: ["$a", "$b", "$c"]}}} // etc. you could also use $sum ]) 

完成。 问题不在查询中。 其实对象ID问题。 所以在一些mongoose逻辑的帮助下,将ID转换为对象ID。 首先调用mongoose即

 var mongoose = require('mongoose'); 

在函数之后只需添加

 var id = mongoose.Types.ObjectId(req.body.id); 

现在问题解决了。 它将string转换为对象。

你的查询是绝对正确的,问题是你传递查询中的“_id”字段是一个string,但如果数据logging是ObjectId,则是“_id”的types。 所以你必须首先将string转换为ObjectId,然后传入查询中的$ match字段中的“_id”字段。

 var docId = mongoose.Types.ObjectId(req.body.id); db.collection.aggregate([ {$match:{_id: docIid}}, {$project: {total: { $sum: [ "$a", "$b", "$c", "$d","$e","$f","$g" ]}}}]); 

使用{$match:{_id:ObjectId("SomeId")}}

 db.collection_name.aggregate([ {$match:{_id:ObjectId("5a153c6d4828c9f51d3adb53")}}, {$project: {total: { $sum: [ "$a", "$b", "$c", "$d","$e","$f","$g" ]}}} ]) 

使用mongoose.Types.ObjectId(id)id转换为ObjectId

输出:

{“_id”:ObjectId(“5a153c6d4828c9f51d3adb53”),“total”:142}