是否可以在MongoDB中找到一些与查询匹配的对象,然后在不修改持久数据的情况下修改结果?
例如,让
students = [
{ name: "Alice", age: 25 },
{ name: "Bob", age: 22 },
{ name: "Carol", age: 19 },
{ name: "Dave", age: 18}
]
现在,我想查询所有年龄小于20岁的学生,在搜索结果中,我只想将“age:X”替换为“under20:1”,结果如下:
result = [
{ name: "Carol", under20: 1 },
{ name: "Dave", under20: 1}
]
不更改数据库中的任何内容。
当然,有可能获得结果,然后在其上调用forEach,但这听起来效率很低,因为我必须重新运行每个对象,所以我正在寻找替代方案。或者没有人?
答案 0 :(得分:2)
一种可能的解决方案是使用聚合pipline,其中$match
后跟$project
:
db.students.aggregate(
[
{
$match: { age: { $lt: 20 } }
},
{
$project:
{
_id: false,
name: true,
under20: { $literal: 1 }
}
}
]);
$literal: 1
是必需的,因为仅使用under20: 1
与under20: true
相同,请求将字段under20
包含在结果中:这将失败为{{1} under20
生成的文档中不存在。
或者要返回学生中的所有文档并有条件地生成match
的值,可能的解决方案是使用$cond
:
under20