使用AWS Lambda和API网关返回MongoDB集合

问题描述:

我在用Python编写的AWS Lambda中有一个函数。使用AWS Lambda和API网关返回MongoDB集合

我想从pymongo的MongoDB集合中提取文档。

我认为这很简单,但我似乎得到的问题(也许是因为ObjectID类型)。

我只是试图做

from pymongo import MongoClient 

def lambda_handler(event, context): 

    client = MongoClient(MONGODB_URI) 

    db = client[DB_NAME] 

    return db.users.find({}) 

,但我得到的错误

{errorMessage= is not JSON serializable, errorType=TypeError, stackTrace=[["\/var\/lang\/lib\/python3.6\/json\/__init__.py",238,"dumps","**kw).encode(obj)"],["\/var\/lang\/lib\/python3.6\/json\/encoder.py",199,"encode","chunks = self.iterencode(o, _one_shot=True)"],["\/var\/lang\/lib\/python3.6\/json\/encoder.py",257,"iterencode","return _iterencode(o, 0)"],["\/var\/runtime\/awslambda\/bootstrap.py",110,"decimal_serializer","raise TypeError(repr(o) + \" is not JSON serializable\")"]]} 

它不工作,如果我用return bson.json_util.dumps(db.users.find({})),但为什么它应该是必要的吗?

据我所知,lambda函数总是返回json,所以我不明白为什么我必须使用bson.json_util

此外,当我使用这个功能,我没有得到正常的ObjectID类型,而是我得到

[ 
    {"_id": {"$oid": "59aed327f25c0f0ca8f94ae1"}, "name": ...}, 
    ... 
] 

虽然我想要的东西像

[ 
    {"_id": "59aed327f25c0f0ca8f94ae1", "name": ...}, 
    ... 
] 

你的问题是由于pymongo不直接返回JSON字符串。如何处理这种情况的一个例子可以在这里找到 -

How do I turn MongoDB query into a JSON?

应当指出的是,API网关预计将返回JSON除非另有配置。 https://aws.amazon.com/blogs/compute/binary-support-for-api-integrations-with-amazon-api-gateway/