Mongodb complex Aggregate查询无法正常工作

时间:2018-03-19 15:35:51

标签: python mongodb nosql aggregation-framework

我有这个数据库:

[{"cliente": {"nombre": "Cafes el amanencer"},
 "mercancia": {"envio": "Normal", "tipo": "Gaseoso", "fecha": "24/12/2003", "peso": 21, "volumen": 43, "origen": "Cadiz", "destino": "Castellon"},
 "vagon": {"id": 1330, "volumen": 202, "peso": 433 }},{"cliente": {"nombre": "Electronica Chispas"}, "mercancia": {"envio": "Normal", "tipo": "Liquido", "fecha": "08/02/2005", "peso": 17, "volumen": 24, "origen": "San Sebastian", "destino": "Orense"}, "vagon": {"id": 1290, "volumen": 111, "peso": 464 }},{"cliente": {"nombre": "Pepe Gotera y Otilio"}, "mercancia": {"envio": "Economico", "tipo": "Contaminante", "fecha": "14/03/2003", "peso": 2, "volumen": 49, "origen": "Santander", "destino": "Burgos"}, "vagon": {"id": 1100, "volumen": 323, "peso": 258 }},{"cliente": {"nombre": "Coches Coco"}, "mercancia": {"envio": "Normal", "tipo": "Explosivo", "fecha": "11/07/2002", "peso": 23, "volumen": 51, "origen": "Avila", "destino": "Santa Cruz de Tenerife"}, "vagon": {"id": 1183, "volumen": 171, "peso": 439 }},{"cliente": {"nombre": "Infraestructuras Fracturas"}, "mercancia": {"envio": "Urgente primera hora", "tipo": "Fragil", "fecha": "07/08/2000", "peso": 53, "volumen": 3, "origen": "Tarragona", "destino": "Soria"}, "vagon": {"id": 1454, "volumen": 408, "peso": 101 }}]

有更多的数据,但要解决这个问题,它会做到。所以我试图寻找两件事(查询):

第一个:列出3" destinos"与大多数发送" mercancias"和#34; origen"和#34; fecha",在这种情况下,我在查询中使用的那个:

 db.mercancias.aggregate(['$project':{origen:'origen', destino:'destino', anio:'fecha'},
 {$match: 'origen':'San Sebastian', $year:{'fecha':08/02/2005}},
 {$group:{'_id':{'$destino', '$anio'}}},{ maximo:{$max:{$count:{'_id':'envio'}}},{$limit:3}}])

我不确定我在查询失败的地方,或者它是否真的与语法有关。

在第二部分中,我试图获得一份" mercancias"用" destino"接近一些coordenates(最大100km),按距离顺序排序(我很遗憾这个,我不知道如何确定coordenates,但我已经在python中编程geoNear,所以问题主要在于查询)。我也想成为一个聚合查询,但正如我所说,我很遗憾我错了。

db.mercancias.find([{$geoNear:{'near:{'type':'Point', 'coordinates':coordinates}maxDistance':100,'distanceField':'dist.calculated'}}])

你认为我需要添加问题以使其更清晰,我会很乐意编辑它。

2 个答案:

答案 0 :(得分:1)

对于第一个,我认为您必须使用project阶段将所有所需数据放在同一级别,之后,您可以在$fecha中使用$year阶段

答案 1 :(得分:1)

您有很多语法错误。你要做的第一件事是正确的语法。我会尝试列出所有可能的修复问题。

项目:

'$project':{origen:'origen', destino:'destino', anio:'fecha'} 

1.打开和关闭支架。

2.删除点符号以访问嵌入字段以及变量引用$。

修正:

{'$project':{origen:'$mercancia.origen', destino:'$mercancia.destino'; anio:'$mercancia.fecha', envio:'$mercancia.envio'}}

匹配度:

 {$match: 'origen':'San Sebastian', $year:{'fecha':08/02/2005}}

1.您正在将查询运算符与聚合运算符组合在一起,这在常规匹配中是不允许的。

2.删除查询条件的开头括号。

3.支持的日期格式为MM / DD / YYYY。

修正:

1.将$match$expr一起使用。

2.为查询条件添加开始和结束括号。

3.更改字符串日期格式以存储为12/24/2003。

{$match:{
  'origen':'San Sebastian', 
  $expr:{$eq:[{$year:{$dateFromString:{dateString:"$anio"}}}, input year ]}
}}

组:

{$group:{ '_id':{'$destino', '$anio'}}},{ maximo:{$max:{$count:{'_id':'envio'}}}
  1. 组密钥应为键值对。
  2. 不能将$ max与$ count结合使用。 $ max是聚合运算符,而$ count是聚合阶段。
  3. 修正:(不确定您的目的是什么,但看起来您希望按destino& envio进行分组并计算其出现次数并按计数递减排序。

    {$group: {_id:{'destino':'$destino', 'envio':'$envio'}, count:{$sum:1} }},
    {$count:{sum:-1}}
    

    全部放在一起。

    数据:

    db.mercancias.insert([
        {"cliente": {"nombre": "Cafes el amanencer"}, "mercancia": {"envio": "Normal", "tipo": "Gaseoso", "fecha": "12/24/2003", "peso": 21, "volumen": 43, "origen": "Cadiz", "destino": "Castellon"}, "vagon": {"id": 1330, "volumen": 202, "peso": 433 }},
        {"cliente": {"nombre": "Electronica Chispas"}, "mercancia": {"envio": "Normal", "tipo": "Liquido", "fecha": "02/08/2005", "peso": 17, "volumen": 24, "origen": "San Sebastian", "destino": "Orense"}, "vagon": {"id": 1290, "volumen": 111, "peso": 464 }},
        {"cliente": {"nombre": "Pepe Gotera y Otilio"}, "mercancia": {"envio": "Economico", "tipo": "Contaminante", "fecha": "03/14/2003", "peso": 2, "volumen": 49, "origen": "Santander", "destino": "Burgos"}, "vagon": {"id": 1100, "volumen": 323, "peso": 258 }},
        {"cliente": {"nombre": "Coches Coco"}, "mercancia": {"envio": "Normal", "tipo": "Explosivo", "fecha": "07/11/2002", "peso": 23, "volumen": 51, "origen": "Avila", "destino": "Santa Cruz de Tenerife"}, "vagon": {"id": 1183, "volumen": 171, "peso": 439 }},
        {"cliente": {"nombre": "Infraestructuras Fracturas"}, "mercancia": {"envio": "Urgente primera hora", "tipo": "Fragil", "fecha": "08/07/2000", "peso": 53, "volumen": 3, "origen": "Tarragona", "destino": "Soria"}, "vagon": {"id": 1454, "volumen": 408, "peso": 101 }}
    ])
    

    查询:

    db.mercancias.aggregate([
       {'$project':{origen:'$mercancia.origen', destino:'$mercancia.destino', anio:'$mercancia.fecha', envio:'$mercancia.envio'}},
       {$match:{
          'origen':'San Sebastian', 
          $expr:{$eq:[{$year:{$dateFromString:{dateString:"$anio"}}}, 2005]}
        }},
       {$group: {_id:{'destino':'$destino', 'envio':'$envio'}, count:{$sum:1} }},
       {$sort:{count:-1}},
       {$limit:3}
    ]);
    

    输出:

     { "destino":"Orense", "envio":"Normal", "count" : 1}