Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何对MongoDB集合中字段的不同值求和(利用mongoose)_Node.js_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

Node.js 如何对MongoDB集合中字段的不同值求和(利用mongoose)

Node.js 如何对MongoDB集合中字段的不同值求和(利用mongoose),node.js,mongodb,mongoose,aggregation-framework,Node.js,Mongodb,Mongoose,Aggregation Framework,假设我有一个名为journals的集合,其中包含以下文档: { "article": "id1", "d": 2 }, { "article": "id1", "d": 2 }, { "article": "id1", "d": 3 }, { "article": "id2", "d": 2 }, ... [ { "_id": "id1", "total": 3, "d2": 2, "d3": 1 }, { "

假设我有一个名为journals的集合,其中包含以下文档:

{
  "article": "id1",
  "d": 2
},
{
  "article": "id1",
  "d": 2
},
{
  "article": "id1",
  "d": 3
},
{
  "article": "id2",
  "d": 2
},
...
[
  {
    "_id": "id1",
    "total": 3,
    "d2": 2,
    "d3": 1
  },
  {
    "_id": "id2",
    "total": 1,
    "d2": 1,
    "d3": 0
  }
]
其中d是一种开关,article是一个参考。现在我想得到如下结果:

{
  "article": "id1",
  "d": 2
},
{
  "article": "id1",
  "d": 2
},
{
  "article": "id1",
  "d": 3
},
{
  "article": "id2",
  "d": 2
},
...
[
  {
    "_id": "id1",
    "total": 3,
    "d2": 2,
    "d3": 1
  },
  {
    "_id": "id2",
    "total": 1,
    "d2": 1,
    "d3": 0
  }
]
我用的是猫鼬,有一个叫做日记的模型。到目前为止我得到的是

Journal.aggregate(
  { $project: {
    articleId: 1,
    depth2 : { $gte:['$d', 2] },
    depth3 : { $eq:['$d', 3] }
  }},
  { $group: {
      _id: '$article',
      total: { $sum: 1 },
      d2: { $sum: '$depth2'},
      d3: { $sum: '$depth3'}
    }
  },
  function (err, journal) {
    console.log(journal);
  }
);
其结果是:

[
  {
    "_id": "id1",
    "total": 3,
    "d2": 0,
    "d3": 0
  },
  {
    "_id": "id2",
    "total": 1,
    "d2": 0,
    "d3": 0
  }
]
显然这里的错误是,
$eq:['$d',3]
没有求和,因为这会导致布尔值

那么是否有更好的表达式将新的depth2和depth3字段投影到
1
0
而不是
true
false

还是有一个完整的更好的方法?:)

我希望避免进行3次查询并预先设置匹配阶段,如
{$match:{d:2}}
您可以使用它将布尔值转换为数值,但您也得到了
$gte
它似乎应该是
$eq
,您的文档使用
article
,而您的代码使用
articleId

Journal.aggregate([
  { $project: {
    article: 1,
    depth2 : { $cond: [{$eq: ['$d', 2]}, 1, 0] },
    depth3 : { $cond: [{$eq: ['$d', 3]}, 1, 0] }
  }},
  { $group: {
      _id: '$article',
      total: { $sum: 1 },
      d2: { $sum: '$depth2'},
      d3: { $sum: '$depth3'}
    }
  }
]);
输出:

{
    "result" : [ 
        {
            "_id" : "id2",
            "total" : 1,
            "d2" : 1,
            "d3" : 0
        }, 
        {
            "_id" : "id1",
            "total" : 3,
            "d2" : 2,
            "d3" : 1
        }
    ],
    "ok" : 1
}

这就像圣诞节,非常感谢!是的,关于articleId,你是对的,它发生在简化示例的过程中。至于$gte,这是故意的,因为它符合我的需要。所以d不完全是一个开关,我在这方面是在撒谎,但在这里问的问题,所以它是最好的描述我可以:)再次感谢你的时间!