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)