繁体   English   中英

如何在PyMongo中执行等效的SQL Join? 或更具体地,用BSON代码调用Pymongo集合对象?

[英]How do I perform the SQL Join equivalent in PyMongo? Or more specific call a Pymongo collection object in BSON code?

我正在尝试像这样在pymongo中执行SQL Join等效项: http ://blog.knoldus.com/2013/02/03/joins-now-possible-in-mongodb/

事实是,我很困惑,因为bson无法编码集合对象。

bson.errors.InvalidDocument: Cannot encode object: Collection(Database(MongoClient('localhost', 27017), 'Application'), 'Products')

所有相关代码:

class Delivery(Repository):

    COLLECTION_ATTRIBUTE = 'deliveriesCollection'

    def __init__(self):
        Repository.__init__(self, self.COLLECTION_ATTRIBUTE)

    def printTable(self):
        from bson.code import Code

        mapper = Code('function() {'
                    '    product = ProductCollection.findOne({_id:this.Product_ID});'
                    '    data = {'
                    '        \'Name\':this.Name,'
                    '        \'Product_ID\': product.ID'
                    '    };'  
                    '    emit(this._id, data );'
                    '}', ProductCollection = product.collection)

        reducer = Code('function(key, values) {'
                    '    return values[0];'
                    '}')

        result = self.collection.map_reduce(mapper, reducer, "myresults")

        for doc in result.find():
            print(doc)

delivery = Delivery()
product = Product()

虽然我不确定您的架构,但是您无法将对MongoDB集合的本地Python引用传递给Code对象,并且无法在数据库服务器上使用它。 您可以传递一个范围对象,但是在这里,这不是您所需要的。 最终,代码只是Javascript,因此它需要本地/本地访问Products集合。

但是,仅提醒我,从2.4+开始,不再可以从MapReduce访问其他集合/数据库/碎片。 因此,您将无法访问相同集合或不同集合中的其他文档,也无法访问地图或约简功能的其他文档。

如果您查找联接,map reduce,mongodb等,您会在Internet上找到许多建议。他们会在同一集合中进行多步map reduce。 这并不简单,也不一定有效。

从您的代码中,您似乎只是想快速查找产品名称。 您可能有多种方法可以在不进行联接的情况下对其进行优化。 我建议在本地缓存名称,当这不起作用时,使用$in运算符收集一组产品,并进行投影以将结果限制为所需的最小字段(例如name ),然后进行缓存这些结果...然后在Python的客户端上执行“本地”连接(在其中,您可以获取name值,并将其输出为“虚拟”类属性,如果需要您的Delivery类,则将其输出,也可以将其输出到下游的其他位置)由客户)。

由于MongoDB有意不支持Joins,因此通常最好考虑您的集合和文档结构是否最适合您所需的模式。

您也可以在MongoDB控制台中创建map reduce函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM