用于解析mongoDB引用的模式

时间:2014-12-23 08:01:07

标签: python mongodb flask pymongo

如果我有这样的文件:

{
    "_id" : ObjectId("5497b4281a78a9120872ca32"),
    "title" : "Thrifty Kitchen",
    "description" : "Damn ugly",
    "products" : [
        ObjectId("54990eeb1a78a91a5758af75"),
        ObjectId("a78a91a5758af7554990eeb1"),
        ObjectId("a5758af990eeb17554a78a91")
    ]
}

...如果(使用pymongo)我想将此文档传递给我的网页模板,那么插入查询的好地方在哪里?我知道我将不得不进行“$ in”查询来获得这些结果,但在ORM世界中,我可以在模型类上编写一个方法,只是暴露一个“get_products”方法。在这里,由于我的视图逻辑直接与Mongo交互并且中间没有ORM,处理这些解决方案的常见做法或模式是什么?

result = mongo.db.mycollection.find_one({"_id": ObjectId(collection_id)})
# wish it could be
for product in result.products:
    print product.myattribute # but that will only return the ObjectId

# would you do something like this?
result.resolved_products = ... # do stuff to resolve ObjectIds

而且,我还没有在谷歌搜索中看到它,但有没有人将查询嵌入到类的方法中,以便您可以为结果对象添加功能?有点像使用ORM但没有架构定义...

1 个答案:

答案 0 :(得分:3)

正如您所料,PyMongo的答案很简单:

resolved_products = list(mycollection.find({'_id': {'$in': result['products']}}))

MongoEngine和其他MongoDB ODM提供了帮助方法来进行这种解除引用。但它们有自己的复杂性和开销;我更喜欢直接查询相关文档,正如我所展示的那样。