mongodb - 使用 $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
我不能根据要求在这里使用展开阶段。
请帮我解决这个问题。
解决方案
当您使用时将返回类似"$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"
}
}
}
}
推荐阅读
- c++ - ld: foo.o:foo.h:6 'bar'的多重定义 foo.h:6: 首先定义在这里
- reactjs - 无法根据在生产中运行的 Gatsby 应用程序中的 URL 参数更新 JSX 属性
- azure - 正在删除 Azure 服务总线主题/订阅
- python - 无法遍历列表 - Openpyxl
- scala - ScalaTest 无法验证 Future 内部的模拟函数调用
- javascript - A-Frame AR.js 应用程序无法识别我的标记模式,并且在加载页面时也会出现黑色覆盖
- java - 使用 Comparator 根据多个字段的值比较对象
- dygraphs - updateOptions 和 strokeWidth
- php - 从 fread 函数中获取数据时显示双数据的计数器
- python - 如何创建一个填充有最小值和最大值的新 DataFrame?