特定职位收集下的所有字段的总和

时间:2017-11-22 08:36:03

标签: node.js mongodb

我的数据集就像这样

{
   "_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。

4 个答案:

答案 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" ]}}}]);