我的数据集就像这样
{
"_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
,它返回Blank Array []。当不使用$match
时,它将返回总和,但不是为了这个id。
答案 0 :(得分:1)
您也可以使用$add
。
db.collection.aggregate([
{$match:{_id: ObjectId("6a1464430b4215046c768y66")}},
{$project: { total: {$add: ["$a", "$b", "$c"]}}} // etc.
])
但是$sum
也应该有效。可能是$match
管道没有返回任何结果吗?
我不知道您使用的驱动程序,但在代码中执行此操作可以解释您的ID。但是,如果直接搜索数据库,则应使用特定的_id
尝试仅执行匹配并找出:
db.collection.aggregate([
{$match:{_id: ObjectId("6a1464430b4215046c768y66")}}
])
如果数据库中执行的$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
])
答案 1 :(得分:0)
使用{$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"), "总" :142}
答案 2 :(得分:0)
完成。问题不在查询中。实际上是Object Id问题。所以借助一些mongoose逻辑将id转换为object id。 首先叫Mongoose,即
var mongoose = require('mongoose');
在功能之后只需添加
var id = mongoose.Types.ObjectId(req.body.id);
现在问题解决了。它将String转换为Object。
答案 3 :(得分:0)
您的查询绝对正常,问题是您在查询中传递“_id”字段的是字符串,但如果数据记录是ObjectId,则为“_id”的类型。因此,您必须先将字符串转换为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" ]}}}]);