使用 Pymongo 时如何查询所有,组?不使用积累?

Posted

技术标签:

【中文标题】使用 Pymongo 时如何查询所有,组?不使用积累?【英文标题】:How can I query all when using Pymongo, group? not using accumulation? 【发布时间】:2022-01-09 18:50:42 【问题描述】: 我正在基于烧瓶和 Pymongo 制作一个宁静的 api。一直在尝试查询特定形状的数据,但很难查询。以下是我的查询代码。
def track_route(from_time, to_time):
    doc = myCol.aggregate([
        "$match": 
            "MessageTime":"$gt": from_time, 
            "MessageTime":"$lt": to_time
        ,
        "$group":
            "_id":'$MMSI',
            "$MMSI":"accumulator1":"$ROT"
        ,
        "$project":"_id":0
    ])
    doc_list = [i for i in doc]
    return doc_list
它返回这个。
pymongo.errors.OperationFailure: The field '$MMSI' must be an accumulator object, full error: 'ok': 0.0, 'errmsg': "The field '$MMSI' must be an accumulator object", 'code': 40234, 'codeName': 'Location40234'
这是我想要返回的形状。
[
  
    123456789: [
      
        MessageTime: '2021-05-28 17:29:22',
        BaseStationID: '999999',
        MsgType: '11',
        mode: '3',
        ROT: '0',
        SOG: '0.0',
        PosAcc: '0',
        lon: '99.32404166666667',
        lat: '93.47150833333333',
        COG: '99.9',
        Heading: '68',
        MessageTimeU: '1622190562',
      ,
      
        MessageTime: '2021-05-28 17:48:57',
        BaseStationID: '4999314',
        MsgType: '11',
        mode: '1',
        ROT: '0',
        SOG: '17.7',
        PosAcc: '1',
        lon: '99.48246666666667',
        lat: '9.980546666666667',
        COG: '999.0',
        Heading: '341',
        MessageTimeU: '1622191737',
      ,
      
        MessageTime: '2021-05-28 13:16:50',
        BaseStationID: '999914',
        MsgType: '11',
        mode: '1',
        ROT: '-128',
        SOG: '0.1',
        PosAcc: '1',
        lon: '999.531585',
        lat: '99.52044166666666',
        COG: '998.2',
        Heading: '511',
        MessageTimeU: '1622175410',
      ,
      
        MessageTime: '2021-05-28 11:45:43',
        BaseStationID: '9903702',
        MsgType: '11',
        mode: '4',
        ROT: '0',
        SOG: '9.4',
        PosAcc: '0',
        lon: '99.51709333333334',
        lat: '9.952831833333333',
        COG: '00.9',
        Heading: '511',
        MessageTimeU: '1622169943',
      ,
    ],
  ,
  
    234567890: [
      
        MessageTime: '2021-05-28 20:59:52',
        BaseStationID: '000702',
        MsgType: '11',
        mode: '1',
        ROT: '-128',
        SOG: '0.0',
        PosAcc: '1',
        lon: '00.46612166666667',
        lat: '00.507135',
        COG: '360.0',
        Heading: '511',
        MessageTimeU: '1622203192',
      ,
      
        MessageTime: '2021-05-28 09:41:51',
        BaseStationID: '0003702',
        MsgType: '11',
        mode: '1',
        ROT: '-128',
        SOG: '4.5',
        PosAcc: '1',
        lon: '00.26525833333334',
        lat: '00.44930333333333',
        COG: '238.7',
        Heading: '511',
        MessageTimeU: '1622162511',
      ,
      
        MessageTime: '2021-05-28 17:48:50',
        BaseStationID: '0003702',
        MsgType: '11',
        mode: '3',
        ROT: '-128',
        SOG: '0.0',
        PosAcc: '0',
        lon: '00.258005',
        lat: '00.41504833333333',
        COG: '00.4',
        Heading: '511',
        MessageTimeU: '1622191730',
      ,
      
        MessageTime: '2021-05-28 14:27:42',
        BaseStationID: '0003702',
        MsgType: '11',
        mode: '4',
        ROT: '0',
        SOG: '7.1',
        PosAcc: '1',
        lon: '00.260425',
        lat: '00.418685',
        COG: '65.0',
        Heading: '511',
        MessageTimeU: '1622179662',
      ,
    ],
  ,
];

123456789和234567890是MMSI值,是子文档的key值。如何在上面的形状中查询?它是嵌套的。如果不能,至少是最相似的方式。

【问题讨论】:

【参考方案1】:

你的聚合有一些错误,你不能引用一个字段作为键,你应该放一个静态的字段名。

这是一种正确的分组方式。

db.collection.aggregate(
  "$group": 
    "_id": "$MMSI",
    "a":  //replace that "a" with any field name you want but not for a $ref
      "$push": "$$ROOT" // you need to use an accumulator like $push, and the correct form to reference the whole doc is $$ROOT
    
  

然后您可以根据需要映射您的信息。可以测试代码here


  "$replaceRoot": 
    "newRoot": 
      $arrayToObject: 
        $map: 
          input: [
            "$$ROOT"
          ],
          as: "el",
          in: 
            "k": 
              $toString: "$$el._id"
            ,
            "v": "$$el.a"
          
        
      
    
  

【讨论】:

虽然我遇到了另一个问题,但它正在工作。由于 restful 只接受 (?) JSON 类型,因此它会将返回的数据吐出。所以我从 bson 应用了 json_util ,然后它打印出结果,但在连续的一行中不是漂亮的版本。可以这样传递到前端吗?还是无论如何都可以解决返回类型问题?顺便说一句,非常感谢。你真的救了我的命。 只要您返回格式正确的 JSON 并且包含带有 application/jsoncontent-type 标头作为值,格式应该无关紧要。另外,如果答案有用,请投票,这样它也可以帮助其他人:)

以上是关于使用 Pymongo 时如何查询所有,组?不使用积累?的主要内容,如果未能解决你的问题,请参考以下文章

当数据非常嵌套时如何使用 $gt 聚合文档和聚合 Pymongo

如何在 pymongo 中使用“组”对相似的行进行分组?

如何使用 PyMongo 查找所有集合的名称?

如何将 pymongo.cursor.Cursor 转换为字典?

如何使用正则表达式查询 pymongo 以获取仅包含数字的值

MongoDB/PyMongo:查询多个条件 - 意外结果