如何领域比较成聚合函数

问题描述:

对不起,我的英语..如何领域比较成聚合函数

我需要如果它们匹配比较user'param(MonthYear/6characters)与外地TxtDtVts(含7个或8个字符的日期) ,

{ 
    "_id" : ObjectId("59e66bdda00472964e6a950b"), 
    "Pharma" : "HEA00001", 
    "TxtDtVts" : 2012016, // Or 22012016 (7 or 8 characts) 
    "TxtHrsVts" : 842, 
    "NumVts" : 845613, 
    "NumEmp" : 19, 
    "NumPoste" : 127, 
    "PVHT" : 1.0575, 
    "CodeTva" : 4, 
    "TauxTVA" : 2.1, 
    "PVTTC" : 1.08, 
} 

这里我的终点,我的聚合函数:

必须由所需月份

下面是我收集的“入场券”归还领域“CodeTva”和“TauxTVA”

secureRoutes.route('/ticketTVA/month/:MonthYear') // Example 012016 

.get(function(req, res){ 
    var mois= req.params.month; 

    Ticket.aggregate([ 

    {$project:{ 
     TxtDtVts:1, 

     Correspondance: { 
      $let: { 
       vars: { 
        monthSubstring: { $substr: [ "$TxtDtVts", 0, -1 ] }, 
        moisReq:{$substr: ["$mois",0,-1]}, 

       }, 
       in: { $cmp: [ "$$monthSubstring", "$$moisReq" ] } 
      } 
     } 
    }}, 

     ],function (err, result) { 
     if (err) { 
      console.log(err); 
      return; 
     } 
     console.log(result); 
     res.json(result); 
    }); 
}) 

我试图使用$ substr将数据转换为字符串,将它们保存在变量中并使用$ cmp来比较它们。

如果我这样做(没有比赛之前),我有一个错误:因为TxtDtVts长度变化(1012016或10012016).. 我怎么能比较这2个数据errmsg: 'aggregation result exceeds maximum document size (16MB) 更多,这是一个不错的方法,如果它匹配,还给我“CodeTva”和“TauxTVA”?

预先感谢您

+0

TxtDtVts似乎是一个整数,而不是字符串或日期。你能否解释一下6字符输入应该如何匹配7或8个字符的输出? –

+0

输入的6个字符表示MMYEAR。 – Jbee

+0

所以输入是一个字符串,MMYYYY,你将它与一个7或8位数的整数进行比较,结构如何?看起来像MDDYYYY或MMDDYYYY? –

试试这个关于大小:请您输入的int,而不是字符串。很容易接受你的意见,并做到这一点。然后:

db.foo.aggregate([ 
    { $addFields: { 
    "rc": {$eq: [{$divide:[{ "$subtract": [ "$date", input ] },1000000]}, 
       {$trunc: {$divide:[{ "$subtract": [ "$date", input ] },1000000]}} ]} 
    }} 
    ,{ $match: {"rc":true}} 
       ]); 

的想法是取一个日期等8022013(2013年2月8日)或25121970(1970年12月25日) 和减去关闭MMYYYY组件。因此,输入22013(字符串“022013”​​的int版本,请注意引导零如何下降)产生8000000.除以1000000以浮点和整数为基础产生相同的数字(8)。如果DB日期是8032013,那么差异是8010000.这产生了不等于8和8.01。

+0

我会尝试使用$ addFields,但如果在我的聚合函数中没有$匹配管道,我总是有同样的错误:errmsg:'聚合结果超过最大文档大小(16MB)'..我可以比较这个两个值转换为$匹配管道? – Jbee

+0

我添加了$ match操作符来只捕获那些匹配的日期。这里没有涉及文档的中间结构;你不应该碰到任何16MB的限制。 –

+0

我找到了一个解决方案:var mois = req.params。MOIS; jrsDuMois = []; var i = 1;对于(; i Jbee

我找到了解决办法

jrsDuMois= []; 
var i = 1; 
for (; i <= 31; i++) { 
jrsDuMois.push(parseInt(i+""+mois)); 
} 

,我和我的数组“jrsDuMois”比较场TxtDtVts:

{ "$match": { 
     "TxtDtVts": { "$in": jrsDuMois }, 
     }},