python - $toString 替代将'_id'从类型 ObjectId() 转换为 mongoDB 版本 3.6.3 中的字符串?
问题描述
我正在执行一个聚合,它使用 $lookup 执行连接,以根据 $match 条件连接 3 个集合,该条件涉及将我已经在 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()
& 传入作为输入,如下所示:
from bson.objectid import ObjectId
pipline_array = ['5d76b2c847c8d3000184a090', '5d7abb7a97a90b0001326010']
pipline_array_converted = []
for i in pipline_array:
pipline_array_converted.append(ObjectId(i))
推荐阅读
- python - Pandas - 在 pandas 应用函数中获取行的索引
- javafx - 修改基础数据时,组合框会触发动作事件
- c# - Cefsharp 铬浏览器仅在 Windows Server 2012 上首次加载
- android - 如何使用actionmode和selectiontracker实现全选按钮以选择recyclerview中的所有项目?
- sql - 仅更新上次更新日期更改的滚动平均值的记录 - SQL Server
- visual-studio - 自动更新 Visual Studio
- python - Python 请求 GET 未获取 JSON 有效负载?
- python - 使用“for”循环和“if”语句加速 Python Lemmatizer
- oracle - oracle PL/SQL 如何确定 IPv6-Address 是否在 IPv6Range 中
- msbuild - MSBuild 16.9 .NET Core 3.1 - OutDir 不搜索依赖项