【问题标题】:how to convert objectid of mongodb child collection to string inplace during aggregation如何在聚合期间将mongodb子集合的objectid转换为字符串
【发布时间】: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" }} ] }。这是您的解决方案。

标签: mongodb aggregate pymongo


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 2016-09-25
    • 1970-01-01
    • 2015-02-18
    • 2019-11-29
    • 2022-01-02
    • 2018-12-13
    • 2016-07-03
    相关资源
    最近更新 更多