首页 > 解决方案 > $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",
            }
        }
    ]

标签: pythonmongodbmongodb-querypymongo

解决方案


如果您希望您的聚合查询自行转换stringObjectId()或反之亦然,那么您需要使用 MongoDB 版本 >= 4.0- 您将在其中使用运算符$toObjectId()&$toString()进行转换。但是,如果您的 MongoDB 版本是 <4.0那么您将别无选择,只能转换和更新一个集合的所有文档中的字段以匹配其他集合中的字段类型。

但是您的问题有所不同,因为您正在传递一个字符串列表并将其与_idusing进行比较$in,因此您可以转换stringObjectId()& 传入作为输入,如下所示:

from bson.objectid import ObjectId


pipline_array = ['5d76b2c847c8d3000184a090', '5d7abb7a97a90b0001326010']
pipline_array_converted = []


for i in pipline_array:
    pipline_array_converted.append(ObjectId(i))

推荐阅读