【问题标题】:mongomock aggregate $lookup does not resolve collection name like real mongo db (python)mongomock 聚合 $lookup 不能像真正的 mongo db (python) 那样解析集合名称
【发布时间】:2021-01-25 11:11:42
【问题描述】:

我有一个像这样的简单聚合查找查询:

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

请注意,此查询使用另一个集合 customer 它的 from 子句。 此查询对实际的 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。 这里出了什么问题?我无法创建适用于模拟和实际数据库的代码。

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

【问题讨论】:

    标签: python mongodb mongomock


    【解决方案1】:

    我发现了问题。我模拟了导入包而不是导入包中的数据库。这实际上导致了类似Database(Database(Collection())) 的结果,而它应该只是Database(Collection())。所以毕竟和mongomock没有任何关系。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 2021-02-22
      • 1970-01-01
      • 2020-04-03
      • 2021-03-24
      • 1970-01-01
      相关资源
      最近更新 更多