我有两个这样的收藏集:
# col1
[
{
_id: '5ec878f79c87a300127ec503',
...
},
{...},
]
# col2
[
{
_id: ObjectId('5ec8da619c87a30012f41d0b'),
record_id: '5ec878f79c87a300127ec503',
...
},
{
_id: ObjectId('5ec8da619c87a30012ffdsk1'),
record_id: '5ec878f79c87a300127ec503',
...
},
]
我使用lookup加入两个集合。
这里是我的汇总查询:
col1.aggregate(
[
{'$lookup': {
'from': 'col2',
'localField': '_id',
'foreignField': 'record_id',
'as': 'records'
}},
]
)
我想将col2._id从objectid转换为字符串。我试过$ project并收到错误:
{'$project': {'col2._id': {'$toString': '$col2._id'}}}
Unsupported conversion from array to string in $convert with no onError value
$ addFields和$ map似乎可行。
{
'$addField': {
'recordsId': {
'$map': {
'input': '$col2',
'as': 'r',
'in': {'$toString': '$$r._id'}
}
}
}
}
但是它返回一个数组并创建了一个新字段。那不是我想要的。
所以我的问题是:如何在聚合期间将col2._id从objectid转换为字符串?
您可以尝试以下选项,我们首先将id转换为String并存储为convertedIdStr,然后使用它进行查找。
[
{
"$addFields": {
"convertedIdStr": {
"$toString": "$_id"
}
}
},
{
"$lookup": {
"from": "test",
"localField": "convertedIdStr",
"foreignField": "record_id",
"as": "records"
}
}
]
希望这会有所帮助!注意我们在col1(collect1)上运行此聚合