如何在聚合期间将mongodb子集合的objectid转换为字符串

Posted

技术标签:

【中文标题】如何在聚合期间将mongodb子集合的objectid转换为字符串【英文标题】:how to convert objectid of mongodb child collection to string inplace during aggregation 【发布时间】:2020-09-19 07:59:52 【问题描述】:

我有两个这样的集合:

# col1
[
  
    _id: '5ec878f79c87a300127ec503',
    name: 'dim'
  ,
  ...,
]
# col2
[
  
    _id: ObjectId('5ec8da619c87a30012f41d0b'),
    record_id: '5ec878f79c87a300127ec503',
    tags: 'authenticated'
  ,
  
    _id: ObjectId('5ec8da619c87a30012ffdsk1'),
    record_id: '5ec878f79c87a300127ec503',
    tags: 'pre'
  ,
]

我想将两个集合合二为一将 col2._id 从 objectid 转换为字符串

这是我的汇总查询:

col1.aggregate(
  [
    '$lookup': 
       'from': 'col2',
       'localField': '_id',
       'foreignField': 'record_id',
       'as': 'records'
    ,
    '$project': 'records._id': '$toString': '$records._id'
  ]
)

我的结果应该是这样的:

# result
[
  
    '_id': '5ec878f79c87a300127ec503',
    'name': 'dim',
    'records': [
        
          '_id': '5ec8da619c87a30012f41d0b',
          'record_id': '5ec878f79c87a300127ec503',
          'tags': 'authenticated'
        ,
        
          '_id': '5ec8da619c87a30012ffdsk1',
          'record_id': '5ec878f79c87a300127ec503',
          'tags': 'pre'
        ,
      ]
  
]

但我遇到了错误。

Unsupported conversion from array to string in $convert with no onError value

我也试过 $addFields$map。它要么覆盖记录并返回一个数组,要么创建一个新字段。这不是我想要的。

'$addFields': 
  'records': 
    '$map': 
        'input': '$records',
        'as': 'r',
        'in': '$toString': '$$r._id'
      
    

所以我的问题是:如何在聚合期间将 col2._id 从 objectid 转换为字符串?

【问题讨论】:

可以使用聚合运算符$toString。 我试过了,问题是子集合 你应该使用$lookup管道进行匹配——在这种情况下。 您必须在records 数组上使用$map - 您已经发布了一些代码。它需要一些修正。使用$mergeObjects 将现有字段与转换后的_id 字段合并(即在应用$toString 之后)。 在您的$addFields 阶段,$mapin 参数值应为:in: $mergeObjects: [ "$$r", "_id": $toString: "$$r._id" ] 。这是您的解决方案。 【参考方案1】:

您可以尝试以下选项,我们首先将 id 转换为 String 并存储为 convertIdStr,然后使用它进行查找。

[
 
  "$addFields": 
     "convertedIdStr": 
        "$toString": "$_id"
     
  
    ,
 
  "$lookup": 
     "from": "test",
     "localField": "convertedIdStr",
     "foreignField": "record_id",
     "as": "records"
  
 
]

希望这会有所帮助! 注意我们在 col1 (collection1) 上运行这个聚合

【讨论】:

以上是关于如何在聚合期间将mongodb子集合的objectid转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongodb 中聚合子集合并应用 $count 不起作用

子集合的 Firestore 监听器

有没有办法在 MongoDB 聚合期间将字符串(格式:“1,5,20,22”)转换为整数数组( [1,5, 20, 22] )?

在 Mongodb/Mongoose 聚合中的子集中应用 $cond

在 Firestore 中删除包含所有子集合和嵌套子集合的文档

WPF TreeView HierarchicalDataTemplate - 绑定到具有多个子集合的对象