【问题标题】:Use $addFields to add a field from lookup stage without unwind使用 $addFields 从查找阶段添加字段而不展开
【发布时间】:2021-04-07 19:01:09
【问题描述】:

我正在尝试使用 $addField 阶段在聚合管道中添加一个字段。在查找后的以下查询中,我不想展开 provider_info,但想添加一个字段 p_insensitive 以用于排序。

db.getCollection('providers').aggregate([
{"$lookup": {
    "localField":   "uid",
    "from":         "users",
    "foreignField": "_id",
    "as":           "provider_info"}},
{"$addFields": {"prov_insensitive": {"$toLower": "$provider_info.full_name"}}},
{"$sort": {"p_insensitive": 1}}

])

它抛出以下错误:

can't convert from BSON type array to String

我不能根据要求在这里使用展开阶段。

请帮我解决这个问题。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    当您使用"$provider_info.full_name" 时,将返回full_name 的数组,例如["ABC"],因此$toLower 运算符只能允许字符串作为输入,

    在这种情况下,您可以尝试两个选项之一,

    • $arrayElemAt从 MongoDB v3.2 开始,从指定索引返回特定元素,
      {
        "$addFields": {
          "prov_insensitive": {
            "$toLower": {
              $arrayElemAt: ["$provider_info.full_name", 0]
            }
          }
        }
      }
    
    • $first从 MongoDB v4.4 开始,返回数组的第一个元素,
      {
        "$addFields": {
          "prov_insensitive": {
            "$toLower": {
              $first: "$provider_info.full_name"
            }
          }
        }
      }
    

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 1970-01-01
      • 2018-08-10
      • 2019-05-10
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      相关资源
      最近更新 更多