【问题标题】:how to join 4 mongo collections如何加入 4 个 mongo 集合
【发布时间】:2019-01-14 17:24:21
【问题描述】:

我正在使用 python 烧瓶,我想加入 4 个集合。我可以在服务器上完成,也可以使用 python 代码。哪个更容易实现这一点。 我想获取集合 A 中存在的所有 id 的所有数据。 例如:我要查找的其余部分是 b_id 中的对象是与数据匹配的数据,与 C 和 D 相同。 我怎样才能做到这一点?

Collection A:

{ 
    “b_id" : "532a234234….”,
    “c_id" : “532fdf….”,
    “d_id”:"532fdf…."

}

Collection B:
{ 
    "_id" : ObjectId(“532a234234…."), 
    “b_type" : “mobile", 
    “b_desc" : “more data….data..."
}



Collection C:
{ 
    "_id" : ObjectId(“532fdf…."), 
    “c_name" : “more data….data..."
}



Collection D:
{ 
    "_id" : ObjectId(“532fdf…."), 
    “d_value" : “more data….data..."
}

我厌倦了 Python 中的 MongoJoin,但我得到的进程模块未安装为错误:(

【问题讨论】:

    标签: python mongodb


    【解决方案1】:

    Mongo 4 Realese(编辑)

    您可以使用$addfield$toObjectId 并在那个新字段上查找


    首先您的 A 集合有一个问题,将其更改为

    { 
    
        “b_id" : ObjectId("532a234234….”),
        “c_id" : ObjectId(“532fdf….”),
        “d_id”: ObjectId("532fdf….")
    }
    

    测试你看结果

    你可以使用Robo3t查看收集信息(不是必需的,但很有帮助)

    在 mongoShell 中你可以像这样加入这 4 个集合

    db.A.aggregate([
    {"$lookup" :
        {
        "from" : "B",
        "localField" : "b_id",
        "foreignField" : "_id",
        "as" : "b_info"
        }
    },
    {"$unwind" :"$b_info"}, // if u want can ignore this line
    {"$lookup" :
        {
        "from" : "C",
        "localField" : "c_id",
        "foreignField" : "_id",
        "as" : "c_info"
        }
    },
    {"$unwind" :"$c_info"}, // if u want can ignore this line
    {"$lookup" :
        {
        "from" : "D",
        "localField" : "d_id",
        "foreignField" : "_id",
        "as" : "d_info"
        }
    },
    {"$unwind" :"$d_info"}, // if u want can ignore this line
    
    ])
    

    现在对于 python,你可以用pymongo exatcly 运行 mongo 命令 首先使用pip 安装它 然后在你的代码中

    from pymongo import MongoClient
    client = MongoClient('localhost', 27017) # change Address and port if not use local host
    db = client.DBNAME # change DBNAME to your DBNAME
    result = list(db.A.aggregate([
    {"$lookup" :
        {
        "from" : "B",
        "localField" : "b_id",
        "foreignField" : "_id",
        "as" : "b_info"
        }
    },
    {"$unwind" :"$b_info"}, # if u want can ignore this line
    {"$lookup" :
        {
        "from" : "C",
        "localField" : "c_id",
        "foreignField" : "_id",
        "as" : "c_info"
        }
    },
    {"$unwind" :"$c_info"}, # if u want can ignore this line
    {"$lookup" :
        {
        "from" : "D",
        "localField" : "d_id",
        "foreignField" : "_id",
        "as" : "d_info"
        }
    },
    {"$unwind" :"$d_info"}, # if u want can ignore this line
    ]))
    

    编辑(将字符串转换为 ObjectId)

    第一个解决方案是在创建 Json 之前创建它们的 ObjectID(如果您有并行或异步,那么创建 2 个相同的 ObjectID 并且由于您知道时间戳生成的值对象 ID 而无法插入)

    from bson import objectid
    b_id = objectid.ObjectId()
    c_id =  objectid.ObjectId()
    d_id =  objectid.ObjectId()
    objB["_id"] =b_id
    objC["_id"] = c_id
    objD["_id] = d_id
    objA["b_id"] = b_id
    objA["c_id"] = c_id
    objA["d_id"] = d_id
    # insert 4 into DB here
    

    第二种方式你已经创建A只需要将字符串转换为ObjectID:

    from bson import objectid
    # objA it what u want to insert in A collection
    for key in objA:
        objA[key] = objectid.ObjectId(objA[key])
    db.A.save(objA)
    

    【讨论】:

    • 谢谢诺扎。创建聚合时如何将 ObjectId 与字符串匹配?
    • 当我在查找部分使用 python 代码时,python 中的编辑器出现错误
    • sry 我的错误我会编辑它。首先在客户端中删除self 第二个类型$lookup$unwind 在“(Javascript 不使用”)(固定)
    • ObjectId 不是字符串你必须from bson import objectid
    • 有没有办法在 python-mongo 中对变量进行类型转换。例如:如果一个字段在 Int 中,而另一个字段在 ObjectId 中?请回答这个问题。我的 A.id 是字符串,而 B.id 是 ObjectId。如果我运行上面的查询它不起作用
    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 2017-04-13
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多