0

我有一个简单的聚合查找查询,如下所示:

cursor = db.my_db['shop'].aggregate([
        {
            '$lookup':
                {
                    'from': 'customer',
                    'localField': 'in_shop',
                    'foreignField': '_id',
                    'as': 'joined_customers'
                }
        }
    ])

请注意,此查询使用customerfrom子句的其他集合。这个查询对实际的 mongo db 工作得很好,但对我的mongomock.MognoClient对象没有。

为了让它与mongomock一起工作,我需要将数据库前缀添加到查询中,如下所示:

cursor = db.my_db['shop'].aggregate([
        {
            '$lookup':
                {
                    'from': 'my_db.customer',
                    'localField': 'in_shop',
                    'foreignField': '_id',
                    'as': 'joined_customers'
                }
        }
    ])

但是,如果我这样做,则此查询不再适用于实际的 mongo DB。这里出了什么问题?我无法创建适用于模拟和实际数据库的代码。

如果我不包含数据库名称,则模拟不会找到其他集合来加入它。需要明确的是,这两个查询在各自的“系统”上都可以正常工作,并且两个集合都可以在自己的模拟中查询。如果子句不包含数据库名称前缀,则仅在 mongomock中查找customer集合就无法正常工作。from

4

1 回答 1

0

我发现了这个问题。我模拟了导入包而不是导入包中的数据库。这实际上导致了类似Database(Database(Collection()))while it should be only的结果Database(Collection())。所以这毕竟没有任何关系mongomock

我猜想学习的是嵌套数据库是可能的,因为它们的行为就像导入包中的变量一样,所以直到内部函数尝试交叉引用另一个集合时才会显示错误。

于 2021-01-25T13:06:11.930 回答