繁体   English   中英

如何对MongoDB集合中字段的不同值求和(使用猫鼬)

[英]How to sum distinct values of a field in a MongoDB collection (utilizing mongoose)

想象一下,我有一个名为Journals的集合,其中包含如下文档:

{
  "article": "id1",
  "d": 2
},
{
  "article": "id1",
  "d": 2
},
{
  "article": "id1",
  "d": 3
},
{
  "article": "id2",
  "d": 2
},
...

其中d是一种开关, 文章是参考。 现在,我想得到如下结果:

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

我正在使用猫鼬,并且有一个名为Journal的模型。 到目前为止,我得到的是……

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字段投影为10而不是truefalse
还是有一个完整且更好的方法? :)

我想避免进行3个查询,并在匹配阶段之前加上{ $match: { d: 2 } }

您可以使用$cond来将布尔值转换为数值,但是您还会得到一个$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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM