首页 > 解决方案 > 使用 $addFields 从查找阶段添加字段而不展开

问题描述

我正在尝试使用 $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

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

请帮我解决这个问题。

标签: mongodbaggregation-framework

解决方案


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

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

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

推荐阅读