我正在执行一个聚合,该聚合基于$ match条件使用$ lookup进行联接以加入3个集合,该条件涉及将'_id'值列表与我在python中已经可用的'_id'值列表匹配到ObjectId(“”) mongoDb中存在的版本。在版本4.0中,$ toString是可行的方法,但是我找不到适合的替代方法
criteria = [
{
'$project': {
'_id': {
'$toString': '$_id'
}
}
},
{
'$lookup': {
'from': 'clients', # other table name
'localField': 'clientId', # name of users table field
'foreignField': '_id', # name of userinfo table field
'as': 'client_info' # alias for userinfo table
}
},
# $unwind used for getting data in object or for one record only
{'$unwind': '$client_info'},
# Join with job_info table
{
'$lookup': {
'from': 'jobs',
'localField': 'jobId',
'foreignField': '_id',
'as': 'job_info'
}
},
{'$unwind': "$job_info"},
# conditions willl go here
{
'$match': {
'$and': [{'_id': {'$in': pipline_array}}]
}
},
{
'$project': {
'_id': 1,
'client_name': "$client_info.name",
'job_name': "$user_role.name",
}
}
]
如果您希望聚合查询本身在运行中立即进行转换string
,ObjectId()
反之亦然,那么您需要使用MongoDB版本> = 4.0
-您将在其中使用运算符$toObjectId()
&$toString()
进行转换。但是,如果您的MongoDB版本是<,4.0
那么您将别无选择,只能转换和更新一个集合的所有文档中的字段以与另一集合的字段类型匹配。
但是您的问题有所不同,因为您要传递一个字符串列表并将其与_id
using进行比较$in
,因此您可以将其转换string
为ObjectId()
&pass-in作为输入,如下所示:
from bson.objectid import ObjectId
pipline_array = ['5d76b2c847c8d3000184a090', '5d7abb7a97a90b0001326010']
pipline_array_converted = []
for i in pipline_array:
pipline_array_converted.append(ObjectId(i))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句