使用 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/json
的 content-type
标头作为值,格式应该无关紧要。另外,如果答案有用,请投票,这样它也可以帮助其他人:)以上是关于使用 Pymongo 时如何查询所有,组?不使用积累?的主要内容,如果未能解决你的问题,请参考以下文章
当数据非常嵌套时如何使用 $gt 聚合文档和聚合 Pymongo
如何将 pymongo.cursor.Cursor 转换为字典?