在特定职位上收集的所有领域的总和
我的数据集是这样的
{ "_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
应该工作。 难道是$match
pipe道不返回任何结果?
我不是使用哪个驱动程序,而是在你的代码中使用它来解释你的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}