javascript - MongoDB:使用 $map 更新查询管道中的对象
问题描述
我有一个从调用返回的对象列表,db.collection.aggregate()
它返回一个结果对象数组,如下所示:
{ _id: <some_id>,
count: 400,
results:
[
{ _id: 1,
...
travel_guess: 0.1934042214126773,
},
{ _id: 2,
<>
...
travel_guess: 0.8451461966883353,
},
...
}
wheretravel_guess
是 mongoDB 的$geoNear
查询管道功能添加的字段。我正在尝试使用查询管道中travel_guess
的ceil(travel_guess)
a进行更新:$map
$project: {
_id: <some_id>,
count: '$count',
results: {
$map: {
input: '$results',
as: 'result',
in: {
'travel': { $ceil: '$$result.travel_guess' }
}
},
},
}
},
虽然这成功更新travel_guess
,但所有其他字段都被删除,所以我最终得到一个像这样的对象:
{ _id: <some_id>,
total: 400,
results:
[ { travel: 1 },
{ travel: 1 },
{ travel: 1 },
{ travel: 1 },
{ travel: 2 },
{ travel: 2 },
{ travel: 3 },
...
]
}
如何在结果对象中保留其他字段?不幸的是,我受限于使用 MongoDB 3.4 版,因此我可以使用的查询管道函数受到限制。
解决方案
您可以指定in
表达式中的每个字段。就像是
{ "$project": {
"_id": 1,
"count": "$count",
"results": {
"$map": {
"input": "$results",
"as": "result",
"in": {
"travel": { "$ceil": "$$result.travel_guess" },
"_id": "$$result._id",
"otherField": "$$result.otherField"
}
}
}
}}
如果你不想指向里面的每个字段$map
{ "$project": {
"_id": 1,
"count": "$count",
"results": {
"$map": {
"input": "$results",
"as": "result",
"in": {
"$mergeObjects": [
"$$result",
{ "travel": { "$ceil": "$$result.travel_guess" }}
]
}
}
}
}}
推荐阅读
- ocaml - 为什么会出现这种语法错误?外壳没有给定原因
- rust - 实现类型的引用添加
- javascript - 为什么我的 componentDidMount() 函数在我刷新页面时不会被触发,但在我第一次登陆页面时会起作用?
- html - Safari中混合字体的行高
- node.js - React - 拒绝加载脚本 Google Analytics 和 Stripe 脚本
- electron - 如果您在电子应用中有 TFF,您是否需要 WOFF
- python - 为什么发生异常时我的 MQTT 客户端无法重新连接
- python - 生成没有相同元素相邻的排列
- java - 你如何不使用 MixIn 渲染丢弃的项目
- javascript - 无法分配给对象的只读属性