MongoDB:查找并修改生成的对象

时间:2015-11-20 09:46:22

标签: mongodb

是否可以在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,但这听起来效率很低,因为我必须重新运行每个对象,所以我正在寻找替代方案。或者没有人?

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案是使用聚合pipline,其中$match后跟$project

db.students.aggregate(
[
    {
        $match: { age: { $lt: 20 } }
    },
    {
        $project:
        {
            _id: false,
            name: true,
            under20: { $literal: 1 }
        }
    }
]);

$literal: 1是必需的,因为仅使用under20: 1under20: true相同,请求将字段under20包含在结果中:这将失败为{{1} under20生成的文档中不存在。

或者要返回学生中的所有文档并有条件地生成match的值,可能的解决方案是使用$cond

under20