[问题]

2down votefavorite

I am trying to fetch data based on some match condition.
First I've tried this: Here ending_date is full date format

Offer.aggregate([

{

$match: {

carer_id : req.params.carer_id,

status : 3

}

},

{

$group : {

_id : { year: { $year : "$ending_date" }, month:
{ $month : "$ending_date" }},

count : { $sum : 1 }

}

}],

function (err, res)

{ if (err) ; // TODO handle error

console.log(res);

});

which gives me following output:

[ { _id: {
year: 2015, month: 11 }, count: 2 } ]

Now I want to check year also, so I am trying this:

Offer.aggregate([

{

$project: {

myyear: {$year: "$ending_date"}

}

},

{

$match: {

carer_id : req.params.carer_id,

status : 3,

$myyear : "2015"

}

},

{

$group : {

_id : { year: { $year : "$ending_date" }, month:
{ $month : "$ending_date" }},

count : { $sum : 1 }

}

}],

function (err, res)

{ if (err) ; // TODO handle error

console.log(res);

});

which gives me following output:

[]

as you can see, _id has 2015 as a year, so when I match
year it should be come in array. But I am getting null array. Why this?

Is there any other way to match only year form whole
datetime?

Here is the sample data

{

"_id": {

"$oid": "56348e7938b1ab3c382d3363"

},

"carer_id": "55e6f647f081105c299bb45d",

"user_id": "55f000a2878075c416ff9879",

"starting_date": {

"$date": "2015-10-15T05:41:00.000Z"

},

"ending_date": {

"$date": "2015-11-19T10:03:00.000Z"

},

"amount": "850",

"total_days": "25",

"status": 3,

"is_confirm": false,

"__v": 0

}

{

"_id": {

"$oid": "563b5747d6e0a50300a1059a"

},

"carer_id": "55e6f647f081105c299bb45d",

"user_id": "55f000a2878075c416ff9879",

"starting_date": {

"$date": "2015-11-06T04:40:00.000Z"

},

"ending_date": {

"$date": "2015-11-16T04:40:00.000Z"

},

"amount": "25",

"total_days": "10",

"status": 3,

"is_confirm": false,

"__v": 0

}

[回答]

You forgot to project the fields that you're using in $match and $group later
on. For a quick fix, use this query instead:

Offer.aggregate([
{
    $project: {
        myyear: { $year: "$ending_date" },
        carer_id: 1,
        status: 1,
        ending_date: 1
    }
},
{ 
    $match: { 
        carer_id: req.params.carer_id,
        myyear: 2015,
        status: 3
    }
},
{
    $group: {
        _id: {
            year: { $year: "$ending_date" },
            month: { $month: "$ending_date" }
        }, 
        count: { $sum: 1 }
    }
}], 
function (err, res)
{
    if (err) {} // TODO handle error 
    console.log(res); 
});

That said, Blakes Seven explained how to make a better query in her answer. I think you should try and use her approach instead.

也就是说,project的字段中必须包含match中用到的字段.

来自: https://stackoverflow.com/questions/33752817/project-with-match-in-aggregate-not-working-in-mongodb

Project with Match in aggregate not working in mongodb的更多相关文章

  1. MongoDB——》聚合查询(project、match、limit、skip、unwind、group、sort)

    https://blog.csdn.net/weixin_43453386/article/details/85065043#1_testweightname_id_35 https://blog.c ...

  2. MongoDB的aggregate聚合

    聚合框架中常用的几个操作: $project:修改输入文档的结构.可以用来重命名.增加或删除域,也可以用于创建计算结果以及嵌套文档.(显示的列,相当遇sql 的) $match:用于过滤数据,只输出符 ...

  3. Mongodb笔记(三)user && aggregate && mapReduce

    版本:mongodb3.4. User: mongodb使用验证登录:默认不开启,mongod中使用--auth开启:  mongod -port=3000 --auth  : 基本方法: db.cr ...

  4. MongoDB.Driver 管道 Aggregate

    目前mongodb for C#这个驱动,在进行Aggregate时,只支持BsonDocument类型,也就是说,你的集合collection也必须返回的是BsonDocument,而实体类型是不可 ...

  5. Mongoose: aggregate聚合 $group使用说明

    aggregate聚合是通过管道操作实现的.聚合管道里的每一步输出,都会作为下一步的输入,每一步在输入文档执行完操作后生成输出文档. 聚合管道:  $project 修改输入文档的结构.可以用来重命名 ...

  6. MongoDB 聚合管道(Aggregation Pipeline)

    管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...

  7. MongoDB 聚合

    聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...

  8. MongoDB高级操作

    参考MongoDB菜鸟教程 一.$type操作符 MongoDB 中可以使用的类型如下表所示: 类型 数字 备注 Double 1   String 2   Object 3   Array 4   ...

  9. MongoDB基础教程系列--第七篇 MongoDB 聚合管道

    在讲解聚合管道(Aggregation Pipeline)之前,我们先介绍一下 MongoDB 的聚合功能,聚合操作主要用于对数据的批量处理,往往将记录按条件分组以后,然后再进行一系列操作,例如,求最 ...

随机推荐

  1. UOJ#219/BZOJ4650 [NOI2016]优秀的拆分 字符串 SA ST表

    原文链接http://www.cnblogs.com/zhouzhendong/p/9025092.html 题目传送门 - UOJ#219 (推荐,题面清晰) 题目传送门 - BZOJ4650 题意 ...

  2. 001_JavaScript学习

    1,面向对象,事件驱动 2,动态,交互性 3,解释性语言,非强(弱)类型变量:不用声明,解释时检查类型 4,区分大小写,嵌入html,句尾加分号,可以独立保存为一个外部文件,但其中不能包含<sc ...

  3. LoadRunner中 host-mapping的Capture Level说明

    lr录制后空白,那么就要弄明白lr中host-mapping的Capture Level选项socket level data.winnet level data.socket level andwi ...

  4. NN:实现BP神经网络的回归拟合,基于近红外光谱的汽油辛烷值含量预测结果对比—Jason niu

    load spectra_data.mat plot(NIR') title('Near infrared spectrum curve—Jason niu') temp = randperm(siz ...

  5. Windows10 下Apache服务器搭建

    Windows10 下Apache服务器搭建   转 https://blog.csdn.net/sunqian666888/article/details/78561399 目录 一.软件下载 二. ...

  6. Spring BPP中优雅的创建动态代理Bean

    一.前言 本文章所讲并没有基于Aspectj,而是直接通过Cglib以及ProxyFactoryBean去创建代理Bean.通过下面的例子,可以看出Cglib方式创建的代理Bean和ProxyFact ...

  7. Springmvc借助SimpleUrlHandlerMapping实现接口开关功能

    一.接口开关功能 1.可配置化,依赖配置中心 2.接口访问权限可控 3.springmvc不会扫描到,即不会直接的将接口暴露出去 二.接口开关使用场景 和业务没什么关系,主要方便查询系统中的一些状态信 ...

  8. 大数据小白系列——HDFS(3)

    这里是大数据小白系列,这是本系列的第三篇,介绍HDFS中NameNode选举,JournalNode等概念. 上一期我们说到了为解决NameNode(下称NN)单点失败问题,HDFS中使用了双NN的机 ...

  9. 解决ant Design dva ajax跨越请求 (status=0)

    今天实现了antd作为前端展现,python flask作为后端的数据填充,完全两个独立的服务:过程中遇到ajax跨越请求问题,导致status一直等于0,原来是这么写的: xmlhttp.open( ...

  10. 课堂练习&课下作业----用户场景分析

    典型用户1 ·小明---一名普通大学生生 名字 小明 性别.年龄 男,19岁 职业 大学生 收入 无 知识层次和能力 石家庄铁道大学学生,善于交际. 生活/工作情况 成绩优异,各方面技能突出 动机,目 ...